2012-09-12 11 views
5
#include <stdint.h> 
uint64_t rip; 
int main() 
{ 
    asm(
     "movq %%rip, %0\n" : "=m" (rip) 
     ); 

    sleep(10); 
} 

जब मैं मैंमैं चीर के मूल्य को क्यों नहीं बचा सकता?

cc -m64 rip.c -o rip 
/tmp/ccwNbZi1.s: Assembler messages: 
/tmp/ccwNbZi1.s:12: Error: suffix or operands invalid for `movq' 
make: *** [rip] Error 1 
+3

आपको इसके चारों ओर हैक करने की जरूरत में परिभाषित किया गया है: // stackoverflow: (http [x86 के लिए वर्तमान शिक्षा का पता प्राप्त करें]। कॉम/प्रश्न/7932287/प्राप्त-पता-वर्तमान-निर्देश-के लिए x86) – Mysticial

उत्तर

11

मिल आप (E|R)IP नहीं पढ़ सकते हैं कोई 86 (/ 64) अनुदेश यह सीधे पढ़ने के लिए है, क्योंकि संकलन।

इसे पढ़ने के लिए एकमात्र तरीका CALL निर्देश के साथ कॉल करना है। यह स्टैक पर रिटर्न पता बचाएगा और जिसे आप पढ़ सकते हैं।

अद्यतन: 64-बिट मोड में आप RIP -relative को संबोधित कर रहे दोहन कर सकते हैं, तो LEA RAX, [RIP] आप ही की पता EAX में दे देंगे। असेंबली में अभी तक एक और कामकाज MOV RAX, $ है।

+3

'mov rax, $ 'या तो लिंकर द्वारा हार्डकोड किया जाएगा, स्थिति-स्वतंत्रता को हटाया जाएगा, या रनटाइम पर स्थानांतरण की आवश्यकता होगी। मैं दृढ़ता से 'ली रैक्स, [रिप]' का उपयोग करने का सुझाव दूंगा। – ughoavgfhw

+0

@ughoavgfhw स्थिति- (इन) निर्भरता के संबंध में प्रश्न में कुछ भी नहीं था। –

+1

यही कारण है कि मैं केवल दृढ़ता से * सुझाव दे रहा था * यह। इसके अलावा, स्वतंत्रता की स्थिति आधुनिक कार्यक्रमों में ज्यादातर एक आम लक्ष्य है, ज्यादातर सुरक्षा कारणों (एएसएलआर) के लिए। कम से कम ऐप्पल के कंपाइलर्स/असेंबलरों को 64-बिट प्रोग्राम के लिए इसकी आवश्यकता होती है। – ughoavgfhw

-1

x86_64 के तहत% rip प्राप्त करने/सेट करने का एकमात्र तरीका है ptrace() का उपयोग करना। नीचे ltrace के स्रोत से कॉपी किया गया है।

void* addr = ptrace(PTRACE_PEEKUSER, pid, (8 * RIP), 0); 
ptrace(PTRACE_POKEUSER, pid, (8 * RIP), addr); 

जहां आरआईपी एक मैक्रो /usr/include/sys/reg.h

+0

आरआईपी-रिश्तेदार 'ली' इसे पढ़ने के लिए, इसे लिखने के लिए 'jmp'। यह प्रश्न वर्तमान धागे के आरआईपी के बारे में है, कुछ अन्य प्रक्रिया नहीं। –

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