对于家庭作业,我正在执行一系列缓冲区溢出攻击。有人给了我一个要反汇编的程序,这是一个不正确调用的函数的 C 源代码gets()
,以及我应该强制程序调用的其他几个函数的源代码。对于其中一项任务,我必须:
主要的是我不明白程序在确定返回位置时在堆栈中查找的位置。方法的返回地址存储在堆栈中的哪里?
该程序是为 x86 编译的。
您需要了解什么:
x86 上的函数调用类似于:
...
int main() add $-0x8,%esp ; alignment
{ push $0x2 ; arg 2
... push $0x1 ; arg 1
func(1, 2); call func ; function call
... add $0x10,%esp ; pop args from stack
} ...
被调用的函数看起来像:
void func(int arg1, int arg2) push %ebp ;\
{ mov %esp,%ebp ;/ create stack frame
int local1; sub $0x18,%esp ; reserves space
... ...
} mov %ebp,%esp ;\
pop %ebp ;/ destroys frame
ret ; returns
因此,堆栈将类似于:
: :
+-----------+
: alignment :
+-----------+
12(%ebp) | arg2 |
+-----------+
8(%ebp) | arg1 |
+-----------+
4(%ebp) | ret | -----> return address
+-----------+
(%ebp) | ebp | -----> previous ebp
+-----------+
-4(%ebp) | local1 | -----> local vars
+-----------+
: alignment :
+-----------+
: :
(较低的地址在 ASCII-art 上较低)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)