BUUCTF-easyre
不,还可以分析main函数的运行过程。进入平台点击该题目,首先下载题目中给的zip压缩包并打开,然后解压。mov rdx, rax:变量。mov r8, rdx:变量。call scanf:执行 scanf,读取两个整数分别存入。记录一次来自BUUCTF平台reverse系列。如果你有C语言基础看到以下代码就知道运行过程了。之后拖到IDA中寻找main函数。在IDA中按f5可以看到以下内容。的位置
记录一次来自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可以看到以下内容

更多推荐



所有评论(0)