2013-03-24 41 views
0

來自buflab of CSAPP的問題。我被要求輸入一段足以破壞堆棧的漏洞代碼。在階段2中,我需要首先更改名爲global_value的全局變量的值,然後調用名爲bang的函數。然而,只有當我將爆炸地址放入堆棧然後返回時纔有效。我可以跳出當前正在執行的功能嗎?

#codes before set the value of global_value 
movl $0x12345678,%eax   /* 0x12345678 is the address of bang */ 
push %eax 
ret 

如果我使用一個直接跳轉像

#codes before set the value of global_value 
jmp 0x12345678 

然後我得到完全失去了在地方,比如用gdb 0x5abcdefg。任何人都可以幫忙這與模式尋址有什麼關係?

+0

' use longjmp()' – 2013-03-24 07:02:12

回答

0

你怎麼知道jmp 0x12345678真的是jmp 0x12345678

從立即數操作數中取出其跳轉地址的所有非遠跳都是相對於緊跟在jmp指令後面的指令的位置。

因此,如果在存儲器中有以下內容:

Address Contents 
0x55555555 E9 78 56 34 12 

那麼這是一個跳躍到0x55555555 + 5(JMP指令長度)+ 0×12345678 = 0x6789ABD2。

OTOH,如果有這樣的:

Address Contents 
0x55555555 E9 1E 01 DF BC 

那麼這是一個跳躍到0x55555555 + 5(JMP指令長度)+ 0xBCDF011E = 0×12345678。

+0

明白了。抱歉回覆晚了。多謝。 – wlnirvana 2013-03-29 14:01:28

+0

還有一個問題.... 彙編程序如何知道我的回報是接近一個還是較遠?真的返回到0x55555555會被'ret 0x5555555'看到嗎? – wlnirvana 2013-03-29 14:09:18

相關問題