0

来自CSAPP 的 buflab 的一个问题。我被要求输入一些足够长的利用代码来破坏堆栈。在第 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 之类的地方完全迷失了。任何人都可以帮忙吗?这与模式的寻址有什么关系吗?

4

1 回答 1

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。

于 2013-03-24T06:57:29.430 回答