来自buflab of CSAPP的问题。我被要求键入一些漏洞代码足够长的时间来破坏堆栈。在阶段2中,我需要首先更改名为 global_value 的全局变量的值,然后调用名为 bang 的函数。但是,它只有在我将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 :(得分:0)
您如何知道jmp 0x12345678
确实是jmp 0x12345678
?
从立即操作数获取跳转地址的所有非远端跳转都是紧跟在jmp
指令之后的指令的位置。
所以,如果你在内存中有以下内容:
Address Contents
0x55555555 E9 78 56 34 12
然后这是跳转到0x55555555 + 5(jmp指令长度)+ 0x12345678 = 0x6789ABD2。
OTOH,如果你有这个:
Address Contents
0x55555555 E9 1E 01 DF BC
然后这是跳转到0x55555555 + 5(jmp指令长度)+ 0xBCDF011E = 0x12345678。