B-6:逆向分析及隐写
从靶机服务器的FTP上下载PE01文件,对PE01.exe二进制文件进行静态调试,将main函数的入口地址作为Flag值提交;
对PE01.exe二进制文件进行静态调试,将该二进制文件中检查许可证的关键函数作为Flag值提交;
对PE01.exe二进制文件进行静态调试,找到Flag1值并提交;
对PE01.exe二进制文件进行静态调试,尝试破解该二进制文件,将注册成功后的回显信息作为Flag值提交;
对PE01.exe二进制文件进行静态调试,将该激活所需的许可证码作为Flag值提交;
从靶机服务器的FTP上下载PE01文件,对PE01.exe二进制文件进行静态调试,将main函数的入口地址作为Flag值提交
首先查看PE01.exe位数
![](https://i-blog.csdnimg.cn/blog_migrate/d2a410a20ddaf965144881e5e356c3f9.png)
使用64位IDA打开PE01.exe
![](https://i-blog.csdnimg.cn/blog_migrate/04e281912f66f30c7d2b62da5573a3b7.png)
Flag : 0x140001000
对PE01.exe二进制文件进行静态调试,将该二进制文件中检查许可证的关键函数作为Flag值提交
打开PE01.exe
![](https://i-blog.csdnimg.cn/blog_migrate/419c2d9219102bf052b99aa233cb50ca.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4e545961da589c1e9f55a3f09222d24c.png)
随便输入一串,按回车执行会报Wrong错误。
通过IDA查看Wrong的位置:
如果Shift+F12无法打开String界面,手动打开方法:
![](https://i-blog.csdnimg.cn/blog_migrate/b34f2197bbc153405dab220eadc4a74d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/0783f6186e4e9f3193b942dd8f773072.png)
![](https://i-blog.csdnimg.cn/blog_migrate/06bc0d5a7f635677b308eb9ed6be8ab8.png)
发现一个特殊的词:P@ssw0rd,我们双击寻找。
![](https://i-blog.csdnimg.cn/blog_migrate/c0cffff34e9a3eaebe831e4ad547abfd.png)
双击溯源:
![](https://i-blog.csdnimg.cn/blog_migrate/0960af312bd53c25cf17b3b58bce2546.png)
下翻可以翻到程序打开就显示的文本,继续往下翻:
![](https://i-blog.csdnimg.cn/blog_migrate/2893fbce4a863f63508617d17f3012f5.png)
找到了Wrong,左上角的是报Wrong的函数。
![](https://i-blog.csdnimg.cn/blog_migrate/f72d27ecdcd37efa9902f75e253d1dc1.png)
可以发现上面也有一个,那么这一段是什么意思呢?这一个晚点说,不是第二题的答案。
![](https://i-blog.csdnimg.cn/blog_migrate/4c24932d17cf81fe0520ef217e9c9b38.png)
我们在左侧找到并进入这个函数,查找许可证判断函数。
可以发现有一个if,如果条件不匹配则跳出Wrong。
![](https://i-blog.csdnimg.cn/blog_migrate/16f1b02a1843ab80b36ebc5e55923c6e.png)
双击进入比对的这个函数。
![](https://i-blog.csdnimg.cn/blog_migrate/287ac5c0b16867abbc8416b50c1e4756.png)
for和if判断,验证函数就是这个函数。
Flag : sub_1400016A0
对PE01.exe二进制文件进行静态调试,找到Flag1值并提交
本题是隐写题。
我们可以发现有一个提示在String界面:
![](https://i-blog.csdnimg.cn/blog_migrate/a0d09e7eefe367860fad9b4e52ad2831.png)
我们使用7z解压PE01.exe。
![](https://i-blog.csdnimg.cn/blog_migrate/52be5cf4d551a854eaaccbcca932910d.png)
背景图片在.rsrc/2052/BITMAP里。
![](https://i-blog.csdnimg.cn/blog_migrate/329a893bcc6fd5bbe5258dc43ce10eaf.png)
在结尾能发现一串可疑的十六进制字符串。
import re
# 使用re(正则表达式)模块从一个字符串中提取十六进制值,将它们转换成ASCII字符,并打印输出。
str ='04 06 06 0C 06 01 06 07 03 01 07 0B 06 03 04 00 04 0E 07 04 05 0F 03 05 06 05 05 0F 06 0D 04 05 07 0D'
ns = str.replace(' ', '')
# 使用replace函数删除空格
len_result = len(ns)
# 变量len_r存储新字符串result的长度
flag = ""
hex_v = ""
for i in range(1, len_result, 2):
# 循环for j in range(1, len_r, 2)从索引1开始迭代新字符串result,步长为2。这是因为十六进制值由一对字符表示
hex_v += (ns[i])
result = re.findall('.{2}', hex_v)
# 使用re.findall函数在字符串hex_v中查找所有出现的两个字符。正则表达式.{2}匹配任意两个字符
for x in result:
flag += (chr(int(x, 16)))
# 第二个循环for i in result1迭代列表中的每个两个字符的字符串。在循环中,每个字符串使用int函数转换为十六进制整数,然后使用chr函数转换为ASCII字符。结果字符被添加到字符串flag中
print(flag)
![](https://i-blog.csdnimg.cn/blog_migrate/b33cd1f5eae765dfa1408d8db4819cde.png)
对PE01.exe二进制文件进行静态调试,尝试破解该二进制文件,将注册成功后的回显信息作为Flag值提交
本题就是上文提到的。
jnz : jump if not zero
意思就是如果不是0,则跳转执行这个函数。
那么条件是什么呢?
是ZF标志位 ZF=1 即跳转
在本题中是 cmp eax , 1
![](https://i-blog.csdnimg.cn/blog_migrate/1cfcf73300f2f390a7a285759afc257f.png)
因此如果eax = 1 则ZF=1,则跳转。
![](https://i-blog.csdnimg.cn/blog_migrate/f72d27ecdcd37efa9902f75e253d1dc1.png)
那么很简单,我们只需要把 cmp eax , 1 改成 0 即可。
先选中1
![](https://i-blog.csdnimg.cn/blog_migrate/200e577a9822713b2ee954ee5a46b895.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4fa04146ad8b94a8cc9ff1e16f0ad509.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c3d5cf1f5e4eb2f9734ec00c9f2ebe2b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/711dbbcda18fca8028c59a06d73e596e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/125f50638b4a22be50f9eaef3aaeb467.png)
![](https://i-blog.csdnimg.cn/blog_migrate/296d2fa69dd1c20a6c9793f248c4db91.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6d8f5edc79d075518bd42e2bc8946bbd.png)
然后打开程序随便输入即可。
![](https://i-blog.csdnimg.cn/blog_migrate/55e0a3af01d9302f0cc52a0126f6a62f.png)
Flag : Flag{yes_u_won!}
本题还有第二种解法,比较麻烦,就是手动nop掉return到0和if的指令,即可实现相同操作。
![](https://i-blog.csdnimg.cn/blog_migrate/95f7cd82f4a3876489979c0b59ad298d.png)
对PE01.exe二进制文件进行静态调试,将该激活所需的许可证码作为Flag值提交
我们查看检验函数
![](https://i-blog.csdnimg.cn/blog_migrate/36c93a189de46fc5d72424afc8610059.png)
也就是,
![](https://i-blog.csdnimg.cn/blog_migrate/3a04a7f82973da56434f048959e18e13.png)
这两个要相等。
关于这题,我对这方面不是很了解,这里推荐一个大佬的文章: