举例说明一下计算指令跳转的偏移量
目录
一、寄存器 eip 存放在执行指令的下一条指令地址,eip唯一确定一条指令。
一、寄存器 eip 存放在执行指令的下一条指令地址,eip唯一确定一条指令。
在执行到80484b5时,此时eip应当指向下一条的指令地址,也就是80484ba。
二、跳转调用其他函数
还是80484b5这行,本行是想调用函数<foo>,因此使用了e8(call)这条指令。e8后面的四字节地址是要调用的函数指令相对call下一条指令的偏移量
原理:
要使e8后接续的四字节地址(本例为 d7 ff ff ff)与eip相加,等于<foo>函数的地址(08048491)
计算过程(如何得出e8后四字节地址)
以foo函数为例,补码计算8048491(<foo>函数的地址)-80484b5(eip)
8048491-80484b5
=(此处用到补码运算公式)8048491补+(-80484b5)补
=0 0 0 0 0 0100 1001 0001 + 1 f f f f 1011 0100 0110
=1 ff ff 1011 1101 0111
=1 ff ff ff d7
求得ff d7,因为堆栈结构,所以e8后地址应为d7 ff ff ff
调用getshell函数
由图得getshell地址:0 804847d
eip:0 80484b5
080484b5-0804847d=ff ff ff c3
因此只需将e8 d7 ff ff ff改为e8 c3 ff ff ff即可调用getshell函数