反汇编测试
任务代码
int g(int x){
return x+3;
}
int f(int x){
int i = 13;
return g(x)+i;
}
int main(void){
return f(8)+1;
}
任务过程
-
使用
gcc -g -no-pie -fno-pic -m32 test.c -o test
指令在64位的机器上产生32位汇编并去除<__x86.get_pc_thunk.ax>
,然后使用gdb test
指令进入gdb调试,设置main函数b main
断点并运行
使用disass
指令获取汇编代码,用i r
指令查看所有寄存器的值:
使用display
指令查看各寄存器中的值,以及当前$eip
中存储地址所对应的指令
main函数将FP压栈push %ebp
,让FP指向保存的FPmov %esp, %ebp
,同时将即将调用函数f的参数x = 8推送到堆栈中
调用函数f push eip ; jump 0x8049185
f函数中获取汇编代码
验证调用函数地址是否为期望函数endbr32
f函数将FP压栈push %ebp
,让FP指向保存的FPmov %esp, %ebp
向下移动SP为自动局部变量i =13分配空间,同时分配临时工作空间tempsub $0x10,%esp
将自动局部变量 i = 13存入栈中movl $0xd,-0x4(%ebp)
,并将所获得参数x作为下一个调用函数的参数继续传递
调用函数gpush eip ; jump 0x8049176
g函数中获取汇编代码
g函数将FP压栈push %ebp
,让FP指向保存的FPmov %esp, %ebp
将参数x = 8放入%eax中mov 0x8(%ebp),%eax
,运算x + 8add $0x3,%eax
将FP复制到SP中,弹出堆栈到FPpop %ebp
,返回调用f
main函数中
1.清除堆栈参数恢复原始状态add $0x4, %esp
2.计算24 + 1add $0x1,%eax
3.将FP复制到SP中,弹出堆栈到FPleave
,返回调用ctr0 ret