本题主要考察简单的绕过反调试,结合动态调试求值。
查壳
无壳32位
ida分析
输入用户名和密码。
发现花指令,无法反编译。
将jbe和aaa那行nop掉,也将产生的这些数据nop掉。
最后得到这样。
将所有左侧标红的地址选中,按p声明为函数,打开函数发现前面是Congratulations,后面是Please try again,并返回result值为1,所以v3==1。(下图没截完整)
分析 sub_401830 函数![](https://img-blog.csdnimg.cn/f24ddd3c78cc419ab487d7e72ea545e3.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQ2hpbGRfSzFuZw==,size_20,color_FFFFFF,t_70,g_se,x_16)
发现里面有很多反调试的东西,大概有四处。
正因为这些东西,如果我们直接debug则不能得出正确结果。
绕过反调试
先将光标定位到有反调试的伪代码那一行,按Tab键,跳转后再右键选择Text view,这样就可以修改汇编指令了,从而去除反调试代码的干扰。
将上图中的jz指令改为jmp指令,jmp对应的操作码为0xE8。同理,把其他几处也改一下。最后别忘了patch into file!!!
完成后可重新查看一下执行流,发现反调试代码消失了,全部绕过。
动态调试 byte_416050 数组
如下图处下断点。第一张是我们所求数组的位置,也是关键代码处;第二章图发现此数组存入ecx中来进行异或的,调试时只用看ecx中的内容。
我们已知用户名,所以直接输入,密码先随便输入一组字符串。
然后F8单步过,注意观察ecx的值。
最后得到byte_416050值为0x2a, 0xd7, 0x92, 0xe9, 0x53, 0xe2, 0xc4, 0xcd
EXP
byte_C26050 = [0x2a, 0xd7, 0x92, 0xe9, 0x53, 0xe2, 0xc4, 0xcd]
v17 = 'dbappsec'
flag=''
for i in range(len(byte_C26050)):
flag += hex(byte_C26050[i] ^ ord(v17[i]))[2:]
print(flag)
#4eb5f3992391a1ae
根据题目将结果进行MD5加密,得到flag。
flag{d2be2981b84f2a905669995873d6a36c}