反汇编测试

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

测试代码如上图

 实现过程:
 首先使用

gcc -g -no-pie -fno-pic -m32 week20191224 -o week20191224

去除<__x86.get_pc_thunk.ax>,使得不提前获得下一条指令的地址。然后使用gdb week20191224 进行调试。

 

 

 进行gbd后

设置main函数断点 b main 后运行

 

 

 使用disassemble指令获取汇编代码,并用i r查看寄存器的值

 

 

 

 

使用display查看这寄存器中的数值,并查看当前$eip中指令:

 

  main函数:

 

  main 函数将FP压栈:push  %ebp,使FP指向,并将f(8)送到地址为$0x8的堆栈之中。

f函数:

 

 汇编代码:

 

 

 

 分析与main函数雷同。

 

 为int i=13分配空间并分配空间temp

 

 将局部变量i存入栈中 movl $0xd,-0x4(%ebp),并将参数传递

g函数:

 

 

 

 

 

 期望地址为endbr32,将FP压栈后指向

 

 

将参数x=5放入 mov   0x8(%ebp),%eax

 

 运算 $0x3,%eax

 

 将FP复制到SP,弹出堆栈到pop %ebp,返回调用f

 

 清除参数,回复现场

 

 将i=13赋值,并计算add11+13

 

 

 

 

 将FP复制到SP,弹出堆栈,返回main

 

 

 清除参数,恢复现场

 

 计算24+1,add $0x1,%eax

 

 

 将FP复制到SP,弹出堆栈,返回ctr0.

指令 eip ebp esp eax 堆栈
endbr32 0x8049185 0xffffd0e8 0xffffd0e8 -132526968  
push %ebp 0x8049189 0xffffd0e8 0xffffd0e0 -134526968  
mov %esp,%ebp 0x804918a 0xffffd0e8 0xffffd0dc -134526968  
sub $0x10,%esp 0x804918c  0xffffd0dc 0xffffd0dc -134526968  
movl $0xd,-0x4(%ebp) 0x804918f 0xffffd0dc 0xffffd0cc -134526968  
pushl 0x8(%ebp) 0x8049196 0xffffd0dc 0xfffffd0cc -134526968  
call 0x8049176 0x8049199 0xffffd0dc 0xffffd0c8 -134526968  
add $0x4,%esp 0x804919e 0xffffd0dc 0xffffd0c8 11  
mov -0x4(%ebp),%edx 0x80491a1 0xffffd0dc 0xffffd0cc 11  
add %edx,%eax 0x80491a4 0xffffd0dc 0xffffd0cc 11  
leave 0x80491a6 0xffffd0dc 0xffffd0cc 24  
ret 0x80491a7 0xffffd0e8 0xffffd0e0 24  

posted on 2021-11-07 20:42  20191224  阅读(64)  评论(0)    收藏  举报

导航