2010-10-24 63 views
2
(gdb) info registers ds 
    ds    0x7b 123 
(gdb) disassemble 
    Dump of assembler code for function [email protected]: 
    0x0804831c <+0>: jmp DWORD PTR ds:0x804a008 
=> 0x08048322 <+6>: push 0x10 
    0x08048327 <+11>: jmp 0x80482ec 
End of assembler dump. 

有人可以描述我如何將ds:0x804a008地址映射到線性地址嗎?我可以使用「x/xw地址」命令?如果不清楚,我想知道代碼跳轉中第一個jmp函數的位置。如何解決段:在GDB中的偏移地址

+0

這是否適用於不使用平面地址空間的平臺? – 2010-10-24 00:30:27

回答

0

現代x86操作系統不使用分段尋址。實模式分段地址只能代表1Mb的地址空間。此尋址方案僅出於兼容性原因在引導過程中使用。

OS將所有段寄存器設置爲選擇器,它們代表您的進程的平面32位地址空間,但您不必擔心這一點。

DS:0x804a008只是相同0x804a008

+1

這不完全正確。現代x86操作系統確實使用線程本地存儲段。儘管段寄存器本身的實際值在64位模式下並不實際相關,但使用FS或GS前綴操作碼會導致CPU將FSBASE或GSBASE MSR值添加到線性地址。 – doug65536 2016-04-29 17:57:44

1

0x804a008是在過程中線性地址空間中的地址 - 在該存儲器位置中的DWORD是將要跳躍到地址(即,0x804a008是一個指針)。 `

所以

x/xw 0x804a008 

將轉儲指針的內容,並

disasm *0x804a008 

將拆解代碼,通過該指針跳躍將被執行。

+0

對不起我的錯,它是一個指針:)你是絕對正確 – user480162 2010-10-24 01:08:13

+0

(GDB)X/XW 0x804a008 0x804a008 <_GLOBAL_OFFSET_TABLE_ + 20>:\t 0x08048322 – user480162 2010-10-24 01:08:44

+1

@ user480162:有文章在http的讀://www.thexploit .com/sploitdev/how-is-glibc-loaded-at-runtime /以瞭解這裏發生了什麼。基本上第一次通過時,它執行'0x08048322'處的代碼,該代碼解析了'printf()'的實際位置並將其放入指針中。所以下次它被稱爲它會直接跳到'printf()' – 2010-10-24 01:17:06

相關問題