前言
1 | 本次CTF题目属于入门题型,之所以写这边文章的原因是由于网上的解题思路思路都是使用IDA伪代码进行解答的,因此本文本着学习动态调试的目的去解题。 |
IDA解法
使用IDA打开reverse_1.exe
IDA打开之后,无明显特征。shift+F12查看字符串,发现flag提示

跳转过去之后,按X查看交叉引用

通过流程图,发现用于判断是否正确获取flag的语句为汇编指令test,eax,eax,然后通过jz指令跳转到flag

直接F5查看伪代码

可以看到this is the right flag字符,说明直接满足if条件即可得到正确的flag
strncmp(&Str1, Str2, v3)用于比较str1与str2字符串,相等时返回0。
!strncmp()即需要满足str1=str2
双击,查看str2字符串

在比较之前存在for循环,该循环的作用是将str2字符串中的字母o改成数字0

因此得出flag为{hell0_w0rld}
X64Dbg解法
调试reverse_1.exe,搜索字符串

点击跳转到input th flag处。

此处for循环,用于遍历字符串hello_world

当eax等于字母o时,替换字母o为数字0

00007FF7DE461970处下断点

1 2 | lea rdx,qword ptr ds:[7FF7DE46C000]lea rcx,qword ptr ss:[rbp+28] |
第一条指令是将输入的字符赋值给rdx
第二条指令是将替换过的字符串hell0_w0rld赋值给rcx

通过strncmp()函数比较两个字符串,相等时返回0

再通过test指令以及je指令来进行条件判断
1 2 3 4 | test指令作用如下:mov eax, 10 ; 将10赋值给eax寄存器test eax, eax ; 执行test指令,检查eax的值是否为零,设置ZF=1je zero ; 当标志寄存器中的零标志位(ZF)为1时执行跳转 |

获取到flag为{hell0_w0lrd}