记录一次来自BUUCTF平台reverse系列
进入平台点击该题目,首先下载题目中给的zip压缩包并打开,然后解压
之后拖到IDA中寻找main函数
答案就是上图中;但就这么结束了?不,还可以分析main函数的运行过程
我们从头到尾逐步分析:
1.栈帧与变量定义
b= dword ptr -8:定义局部变量b,位于栈帧中rbp-8的位置(4 字节整型)
a= dword ptr -4:定义局部变量a,位于栈帧中rbp-4的位置(4 字节整型)
push rbp; mov rbp, rsp:标准栈帧建立,rbp 作为栈帧基址
sub rsp, 30h:为局部变量分配 48 字节的栈空间(30h 是 16 进制,对应十进制 48)
call __main:调用 C++ 的初始化函数(通常用于全局 / 静态变量初始化)
2.scanf 输入处理
lea rdx, [rbp+b]; mov r8, rdx:变量b的地址(&b)
lea rax, [rbp+a]; mov rdx, rax:变量a的地址(&a)
lea rcx, Format:格式化字符串"%d%d"的地址
call scanf:执行 scanf,读取两个整数分别存入a和b
mov edx, [rbp+a]
:把变量a的值加载到edx寄存器
mov eax, [rbp+b]
:把变量b的值加载到eax寄存器
cmp edx, eax
:比较edx(a)和eax(b),即执行 a == b?
jnz short loc_40152F
:如果不相等(jnz=jump if not zero),跳转到loc_40152F地址
如果你有C语言基础看到以下代码就知道运行过程了
int main(int argc, const char **argv, const char **envp) { int a, b; /***对应栈帧中的a(rbp-4)、b(rbp-8)***/ /***初始化操作(对应call __main)***/ /***读取两个整数到a和b***/ scanf("%d%d", &a, &b); /***比较a和b是否相等***/ if (a != b) { /***跳转到loc_40152F对应的代码逻辑 /***(汇编中未展示这部分内容)***/ } /***如果a == b,执行后续代码(未展示)***/ return 0; }在IDA中按f5可以看到以下内容