1.老规矩,拿到文件,进行查壳
收集信息,无壳,32位程序
2,试着运行一下
发现就是一个类似于登录的东西
3.拖入ida中,进行分析
找到大体的函数,进行简单的代码分析
大概是这个样子
先跟进我们遇到的第一个函数sub_404090,通过分析可以知道,是这个函数对v7进行了处理
里面大概就是这个样子,
我们可以得到我们输入的用户名没有改变,改变的是byte_416050数组
先放到一边,分析下一个函数sub_401830
我们来理一下,求根据用户名求密码的大概思路
这个时候我们输入的密码,暂时储存在v6中
跟进sub_401830函数
我们输入的密码的形参为a2,跟踪a2
发现a2又传给了v8
其实到这里,我就不行了,求助大佬后,对这些伪代码又加了点注释
接着v8里面的东西又传到了v9,随后又到了v15中
我肯定是不会,我只会啊巴啊巴,这些注释是在看大佬的wp后才知道其中的奥秘
这个时候我们就开始使用OD进行动态调试得到byte_416050的东西
该怎么动态调试呢?
这个时候我们直接寻找byte_416050的地址肯定是不好找的
那么我们知道什么?
我们知道我们寻找的数组进行了异或,我们这个数组的周围有个sub_401710函数
所以在汇编中肯定存在call sub_401710(调用sub_401710函数)
我们直接来到汇编代码的最顶端
跟踪call函数
找到满足条件的call
1。调用了sub_401710函数
2.调用的上方不远处有xor(异或)
所以我们可以知道发生异或的地址为00401B3E
这个时候打开OD进行动态调试
并且记录下 byte_416050的值
在B3E处设置断点,并且注意观察寄存器的值(上图还未绕过反调试)
注意我们前面已经发现了反调试。所以在进行动态调试之前要把反调试nop掉
最后得到byte_416050的值为[0x2a,0xd7,0x92,0xe9,0x53,0xe2,0xc4,0xcd]
编写脚本,解密
box = [0x2a,0xd7,0x92,0xe9,0x53,0xe2,0xc4,0xcd]
a =[100,98,97,112,112,115,101,99]
for i in range(8):print(hex(a[i]^box[i])[2:],end = '')
最后得到结果
4eb5f3992391a1ae
再带到网站进行md5加密
最后得到flag{d2be2981b84f2a905669995873d6a36c}
带到网站验证
正确!!!!