मैं book [rus] पढ़ रहा था (मुझे खेद है, मुझे इस समय एक अंग्रेजी संस्करण नहीं मिल रहा है) क्रिस कास्पर्स्की द्वारा लिखित सॉफ्टवेयर सुरक्षा के सिद्धांतों और तकनीकों को समझाते हुए।किसी विशेष सुरक्षा अनुकूलन की व्याख्या की आवश्यकता है
पुस्तक में एक उदाहरण है। यह कहा गया है कि कोड:
if (! IsValidUser())
{
Message("Invalid user! Abroting...");
Abort;
}
पूरी तरह से असुरक्षित है क्योंकि यह इस में अनुवाद किया जा रहा है:
CALL IsValidUser
OR AX,AX
JZ continue
^^^^^^^^^^^^^
PUSH offset str_invalid_user
CALL Message
CALL Abort
continue: ; normal program execution
...........
इस प्रकार कार्यक्रम एक disassembler में सिर्फ एक बाइट बदलकर काट दिया जा सकता है। अगर हम JZ continue
से JMP continue
बदलते हैं तो चेक सही तरीके से नहीं किया जाएगा।
फिर क्रिस लिखते हैं:
सी में कार्यक्रम का सही संस्करण है:
IsValidUser();
if (!true)
{
Message("Invalid user! Aborting...");
Abort;
}
इस संस्करण {...}
खंड एक नियंत्रण मिलता है कभी नहीं होगा।
मुझे वास्तव में यह नहीं पता कि सही संस्करण को कैसे काम करना है। वह if-statement
का उपयोग क्यों करता है जिसे कभी भी निष्पादित नहीं किया जाएगा इस प्रकार एक कंपाइलर द्वारा भी हटाया जा सकता है?
क्या यह एक टाइपो या त्रुटि है? या मुझे कुछ नहीं मिल रहा है?
या तो एक टाइपो होना है, या पुस्तक बेकार है क्योंकि यह * unoptimized * कोड के बारे में बात कर रही है। –
@ कोडीग्रे यह मैं था जो यह समझने में असफल रहा कि 'प्रोग्राम का सही संस्करण' वास्तव में क्या है। असल में यह एक त्वरित उदाहरण था कि कैसे कुछ कोड सुरक्षित लगता है वास्तव में असुरक्षित हो सकता है। वैसे भी आपके प्रोग्राम को हैक किए जाने वाले संभावित तरीकों को जानना हमेशा उपयोगी होता है। – Kolyunya
"ठीक" जैसा कि "पैच के बाद जिस तरह से दिखता है ... –