反汇编测试

反汇编测试

1.实验准备

1.1函数源代码

int g(int x){
    return x+3;
}
int f(int x){
     int i = 27;
    return g(x)+i;
}
int main(void){
    return f(8)+1;
}

1.2设置环境

  • 使用指令sudo apt-get install libc6-dev-i386sudo apt-get install gcc-multilibsudo apt-get install g++-multilib,安装一个库,使编译64位Linux版本32位的二进制文件:

  • 使用gcc -g week1327.c -o week1327 -m32指令在64位的机器上产生32位汇编,然后使用gdb week1327指令进入gdb调试器:


2.过程分析

  • 进入之后先在main函数处设置一个断点,再run一下,s进入指定代码行,使用disassemble指令获取汇编代码,用i(info) r(registers)指令查看各寄存器的值:

  • 可知基序列位0xffffd168

  • 结合display命令和寄存器或pc内部变量,做如下设置:display /i $pc,这样在每次执行下一条汇编语句时,都会显示出当前执行的语句。

  • call指令将下一条指令的地址入栈,此时%esp,%ebp和堆栈的值为:

  • 将上一个函数的基址入栈,从当前%esp开始作为新基址:

  • 先为传参做准备:

  • f函数的汇编代码:

  • 实参入栈:

  • 主函数汇编代码:

截图:

posted @ 2021-11-03 23:01  唐子越  阅读(32)  评论(0编辑  收藏  举报