ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

BUUCTF-easyre

BUUCTF-easyre

记录一次来自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可以看到以下内容

返回列表