反汇编测试
反汇编测试
参考博文GDB调试汇编堆栈过程分析
测试代码
#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 - g week1307.c -o week1307 -m32
编译遇到问题
经过查询后得知需要安装multilib库:
sudo apt-get install gcc-multilib
sudo apt-get install g++-multilib
使用gcc - g week1307.c -o week1302 -m32进行编译,使用gdb week1307进入gdb
进入之后先在main函数处设置一个断点,再run一下,使用disassemble指令获取汇编代码,用i(info) r(registers)指令查看各寄存器的值:
可见此时主函数的栈基址为0xffffd1f8,用x(examine)指令查看内存地址中的值,但目前%esp所指堆栈内容为0,%ebp所指内容也为0
结合display命令和寄存器或pc内部变量,做如下设置:display /i $pc,这样在每次执行下一条汇编语句时,都会显示出当前执行的语句。下面展示每一步时%esp、%ebp和堆栈内容的变化:
可见8被压入了栈中,同时esp减少了4
使用si命令,进入f函数,此时%esp,%ebp和堆栈的值为:
单步运行汇编代码
call指令将下一条指令的地址入栈,进入g函数
g函数运算完成后,ret返回f函数
f函数运算完成后,ret返回main函数
最终结果被写入eax寄存器中
f函数的汇编代码
f() | eip | ebp | esp | eax |
---|---|---|---|---|
endbr32 | 0x565561c6 | 0xffffd1f8 | 0xffffd1f0 | 0x56558fdc |
push %ebp | 0x565561ca | 0xffffd1f8 | 0xffffd1f0 | 0x56558fdc |
mov %esp %ebp | 0x565561cb | 0xffffd1f8 | 0xffffd1ec | 0x56558fdc |
sub $0x10 %esp | 0x565561cd | 0xffffd1fc | 0xffffd1ec | 0x56558fdc |
call 0x56556213 %esp | 0x565561d0 | 0xffffd1fc | 0xffffd1dc | 0x56558fdc |
add $0x2e07 %eax | 0x565561d5 | 0xffffd1fc | 0xffffd1dc | 0x565561d5 |
movl $0x2 0x4(%ebp) | 0x565561da | 0xffffd1fc | 0xffffd1dc | 0x56558fdc |
push 0x8(%ebp) | 0x565561e1 | 0xffffd1fc | 0xffffd1dc | 0x56558fdc |
call 0x565561ad |
0x565561e4 | 0xffffd1fc | 0xffffd1d8 | 0x56558fdc |
add $0x4 %esp | 0x565561e9 | 0xffffd1fc | 0xffffd1d8 | 0xb |
mov -0x4(%ebp) %edx | 0x565561ec | 0xffffd1fc | 0xffffd1dc | 0xb |
add %edx %eax | 0x565561ef | 0xffffd1fc | 0xffffd1dc | 0xb |
leave | 0x565561f1 | 0xffffd1fc | 0xffffd1dc | 0xd |
ret | 0x565561f2 | 0xffffd1f8 | 0xffffd1f0 | 0xd |