逆向攻防世界CTF系列10-csaw2013reversing2

32位无壳

提示:听说运行就能拿到Flag,不过菜鸡运行的结果不知道为什么是乱码

运行果然出乱码…

解法1:静态分析

image-20241015103022172

大概是要MessageBoxA输出结果flag,但是我们输出的是乱码,可能是if语句没有执行,此外,if 语句中还有个exit函数

我们没输出flag的原因是因为sub_401000没有执行,我们想办法让他执行

image-20241015104442383

左侧的MessageBoxA:一个没有被调用的弹框函数

修改点1:红框1处jzn改为jmp就是无条件跳转,

修改点2:jmp short loc_4010EF改为 jmp short loc_4010B9,避免让他执行exit函数。

修改点3:int 3(__debugbreak();) 改为 nop

__debugbreak () 是一个内置函数,用于在程序运行时生成一个软件断点,从而暂停程序执行并等待调试器连接。

一旦你的进程执行到int 3指令时,操作系统就将它暂停。在Linux上,这会给该进程发送一个SIGTRAP信号。

NOP(No Operation)指令是一种在多种编程语境中存在的操作,其基本功能是不执行任何操作。在机器语言中,NOP指令通常用于占用时间周期,而不改变任何程序状态,如寄存器或内存内容。这种指令在不同的处理器架构中可能有不同的实现方式,但其核心目的相同。

使用keypatch修改,可以百度,当然你也可以使用Edit > Patch program > Assemble,dit > Patch program > Apply pathes to input file > OK

keypatch比较简单:

image-20241015104953838

修改完成:

image-20241015105150046

image-20241015105210414

dit > Patch program > Apply pathes to input file > OK

后,运行得到flag

image-20241015105314937

flag{reversing_is_not_that_hard!}

解法2:OD调试

OD调试,参考这篇博客

入门:【逆向】nop 填充爆破 简例 nop空指令替换 无条件执行 - Hello霖 - 博客园 (cnblogs.com)

本题题解:XCTF-csaw2013reversing2-CSDN博客

IsDebuggerPresent(),这个函数目的就是反调试(检测是否处于调试环境中)

  • 如果当前进程在调试器的上下文中运行,则返回值为非零。

  • 如果当前进程未在调试器的上下文中运行,则返回值为零。

OD基本操作

F2:设置断点,只要在光标定位的位置(上图中灰色条)按F2键即可,再按一次F2键则会删除断点。(相当于 SoftICE 中的 F9)

F8:单步步过。每按一次这个键执行一条反汇编窗口中的一条指令,遇到 CALL 等子程序不进入其代码。(相当于 SoftICE 中的 F10)

F7:单步步入。功能同单步步过(F8)类似,区别是遇到 CALL 等子程序时会进入其中,进入后首先会停留在子程序的第一条指令上。(相当于 SoftICE 中的 F8)

F4:运行到选定位置。作用就是直接运行到光标所在位置处暂停。(相当于 SoftICE 中的 F7)

F9:运行。按下这个键如果没有设置相应断点的话,被调试的程序将直接开始运行。(相当于 SoftICE 中的 F5)

CTR+F9:执行到返回。此命令在执行到一个 ret (返回指令)指令时暂停,常用于从系统领空返回到我们调试的程序领空。(相当于 SoftICE 中的 F12)

ALT+F9:执行到用户代码。可用于从系统领空快速返回到我们调试的程序领空。(相当于 SoftICE 中的 F11)