2009-04-21 20 views
6

सुरक्षा कक्षा के लिए असाइनमेंट के रूप में, मैं अपने कोड में __asm__("jmp 0xbffff994"); का उपयोग करने की कोशिश कर रहा हूं, लेकिन जब मैं gdb में चीजों को अलग करता हूं, तो निर्देश jmp 0xc8047e2a में बदल जाता है। कोई विचार क्यों मैं और किसी विशेष पते पर कैसे जा सकता हूं?x86 एक पते पर जाएं

+2

क्यों आपको बिल्ली को कच्चे पते पर कूदने की आवश्यकता है? मुझे इसके लिए किसी भी संभावित (गैर-घृणास्पद) उपयोग को समझने में कठिनाई हो रही है। – kquinn

+0

आप किस प्रणाली का उपयोग करते हैं? –

+5

@kquinn परवाह किए बिना, उनके प्रश्न पूछे गए हैं, आइए इसका उत्तर देने का प्रयास करें। – samoz

उत्तर

18

शायद क्योंकि यह किसी रिश्तेदार पते पर कूद रहा है, और लिंकर या लोडर ने आपका कोड ले जाया है। एक चर में पता लगाने की कोशिश करें, और उसके बाद कार्य करें:

jmp dword [var] 

या वैकल्पिक रूप से:

push 0xbffff994 
ret 
+5

* वह * सही उत्तर है, यह भी ध्यान दें कि: "mov eax, 0x11223344; jmp eax"; यह भी काम करेगा और सबसे सीधे आगे की संभावना है। –

+1

बहुत सच है, लेकिन वह फास्टकॉल का उपयोग कर रहा है (मुझे 0xbffff994 के महत्व का यकीन नहीं है)। – Mark

+0

पुश आरईटी संयोजन काम करता है! धन्यवाद! – Martin

0

डैनियल बताता है कि आपकी कूद एक जैसी प्रोग्राम क्यों नहीं है। इसे ऑब्जेक्ट फाइलों और लिंकिंग के साथ करना है।

यदि आप किसी विशेष पते पर कूदना चाहते हैं, तो डीबगर या डिस्सेबलर का उपयोग करके कूदना सबसे अच्छा है।

0

अपने सिस्टम पर (जीसीसी संस्करण 4.2.4, उबंटू) इस disassmbley (अंतर्दृष्टि) पर ठीक लग रहा है :

disassmbley की
 
int main() 
{ 
asm("jmp 0xbffff994"); 
return 0; 
};  

परिणाम (अंतर्दृष्टि):

 
     0x8048344  :     lea 0x4(%esp),%ecx 
-  0x8048348  :    and $0xfffffff0,%esp 
-  0x804834b  :    pushl -0x4(%ecx) 
-  0x804834e  :    push %ebp 
-  0x804834f  :    mov %esp,%ebp 
-  0x8048351  :    push %ecx 
-  0x8048352  :    jmp 0xbffff994 
-  0x8048357  :    mov $0x0,%eax 
-  0x804835c  :    pop %ecx 
-  0x804835d  :    pop %ebp 
-  0x804835e  :    lea -0x4(%ecx),%esp 
-  0x8048361  :    ret 
+0

मुझे लगता है कि यह डिस्सेबलर jmp का ऑफ़सेट दिखा रहा है और इसका वास्तविक लक्ष्य नहीं है। (जब आप इसे 32-बिट तत्काल ऑपरेंड देते हैं तो jmp निर्देश ईप के सापेक्ष ऑफसेट लेता है)। –

+0

आप इसका अनुमान क्यों लगाएंगे? क्या इसका परीक्षण करने का कोई तरीका है? यह नीचे जीडीबी के साथ एक ग्राफिकल इंटरफ़ेस के रूप में चल रहा है। –

+0

या यह हो सकता है कि कोई स्थानांतरण नहीं है। हालांकि, अगर आप असेंबली के साथ ऑपकोड डंप करते हैं तो आप ऑफ़सेट देख पाएंगे। – Mark

0

संकलन समय पर सटीक पता निर्धारित करना मुश्किल है, क्या आपने लेबल का उपयोग करने का प्रयास किया है? Jmp के साथ उनका उपयोग करना बहुत आम है।

उदाहरण:

start: 
jmp exit 

exit: 
ret 
0

मैं एक हेक्स संपादक का उपयोग और बस मान परिवर्तित करता है, तो यह सिर्फ एक बार की बात है की सिफारिश करेंगे।

संबंधित मुद्दे