反汇编测试

反汇编测试

参考博文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
posted @ 2021-11-06 18:12  南城花落  阅读(35)  评论(0编辑  收藏  举报
/* 看板娘 */