记录一次来自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,读取两个整数分别存入ab

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可以看到以下内容

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐