我可以跳出当前执行的功能吗?

时间:2013-03-24 06:46:01

标签: assembly x86

来自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这样的地方。有人可以帮忙吗?这与模式的寻址有什么关系吗?

1 个答案:

答案 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。