反汇编测试
测试代码
#include<stdio.h>
int g(int x){
return x+3;
}
int f(int x){
int i = 02;
return g(x)+i;
}
int main(void){
return f(8)+1;
}
用gcc在64位机器上编译一个32位的程序,遇到报错
- 解决办法:安装multilib库
sudo apt-get install gcc-multilib
sudo apt-get install g++-multilib
使用gcc - g week20191302.c -o week1302 -m32
进行编译,使用gdb week1302
进入gdb
在main函数设置断点,再run一下,使用disassemble指令获取汇编代码,用i r指令查看各寄存器的值:
可见此时主函数的栈基址为0xffffd108,用x查看其值为0。
使用指令display /i $pc
,单步执行并显示%esp和%ebp的值。
- 可见8被压入了栈中,同时esp减少了4
使用si命令,进入f函数
单步运行汇编代码
call指令将下一条指令的地址入栈,进入g函数
g函数运算完成后,ret返回f函数
f函数运算完成后,ret返回main函数
最终结果被写入eax寄存器中
f函数的汇编代码
- 在纸上画出f中每一条语句引起的eip(rip),ebp(rbp),esp(rsb),eax(rax)的值和栈的变化情况