攻防世界csaw2013reversing2
查壳,无壳

运行一下,发现是乱码

拖入ida中,找到main函数,f5查看伪代码

关键函数为IsDebuggerPresent,这个函数的作用是检测当前程序是否正在被调试,从图中可以看到,如果不是被调试,则会执行MessageBoxA函数,显示乱码。
关于IsDebuggerPresent函数与fs寄存器的介绍参考如下链接
(23条消息) 反调试技术- IsDebuggerPresent,原理 与 反反调试_desword– 技术,杂文。-CSDN博客_isdebuggerpresent
fs寄存器 - 深蓝无忌 - 博客园 (cnblogs.com)
查看汇编代码,发现int3中断

int3中断介绍
(23条消息) int 3 软中断指令_niuyisheng的专栏-CSDN博客_int3中断
通过x64dbg动态调试,达到中断位置,即可求解
首先用x64dbg打开程序,设置在入口断点处停止

可以看到如图情况

F9运行,即可运行至int3断点的位置

我们注意到mov指令就是将flag的地址存入edx中,所以我们要执行这条语句,但由于int3,无法直接F8运行,可以先将int3用nop代替,在int3处按下空格键即可进行patch

F8运行后,注意到寄存器窗口EDX的值发生变化

右键选择在内存中转到

然后在F8运行call函数即可得到flag
