常用的ELF格式的二进制代码
.text只读的代码区
.data可读可写的数据区
.bss可读可写且没有初始化的数据区
反编译一个可执行文件,每当进入新的函数中,
push %ebp //保存栈基址
push %esp,%ebp //将基址设为当前esp
sub $0x4,%esp //如果函数有返回值,要预留地方
...
mov %eax,0xfffffffc(%ebp)
mov 0xfffffffc(%ebp),%eax //返回值放入堆栈预留地中和esp中
此时,
0x4(%ebp)存放着调用函数的调用本函数后下一条指令的eip
0x8(%ebp)存放着调用函数传递的第一个参数
0xc(%ebp)以此类推,存放着调用函数传递的第二个参数,如果有这么多参数的话
...
leave //mov %ebp,%esp;pop %ebp //恢复调用函数的栈顶、栈底
ret //pop %eip //即前面所说的0x4(%ebp)那个地方存放的eip
阅读(527) | 评论(0) | 转发(0) |