本帖最后由 ZJevon 于 2021-2-27 16:46 编辑
0x00 观察程序基本信息
MD5:4b15e259c525a1f39d2ff779d0f10e07
SHA1:889a87541c32ef1d9c1eca157904bbb9741bf144
1.加了UPX压缩壳,利用Stud_PE关掉ASLR直接ESP定理脱壳。
2.脱掉壳的程序观察字符串,发现一些关键字符串。
0x01 基本解法
利用此前找到的字符串定位到了Main函数,先设置控制台程序标题然后打印输入提示符,再输入Key最后明文比较长度和内容,最后比较的内容是动态生成的,所以我们只要找到比较的关键位置就可以解决此题。
通过Success找到最终打印成功的地方,往前几行大致分析一下逻辑下个断点F9走过来就可以发现Key了。
0x02 利用符号执行插件Ponce
正常对于Key的求解到这里就应该结束了,正好之前了解到Ponce这个IDA插件就想着这题应该可以用上就拿来练练手了。
1. Ponce介绍
GitHub项目链接:https://github.com/illera88/Ponce
下载插件下载地址:https://github.com/illera88/Ponce/releases/tag/v0.3
Ponce是一款开源的符号执行的IDA插件,在IDA静态分析过程中, 可以使用它来进行更加快速方便的对程序进行分析,简单的说就是这个插件帮我们一键完成了符号执行的过程。只要把对应版本的Dll文件放到IDA所在的plugins\目录下就可以了。
2. 开始解题
先在输入函数的上面和字符串比较地方下断点。
然后启动IDA的Windows本地调试(注: IDA7.0貌似有Bug不能Windows本地调试),开始调试。
输入23个字符串,并在堆栈窗口找到输入的字符串存放的内存地址。
Ctrl+Shift+M设置符号,F9跑起来,会到我们刚才下断点的地方并出现“Symbolic branch, make your choice! ”。
在这句汇编语句右击 -> SMT Solver -> Negate & Inject,观察数据窗口发现我们的输入已经被修改了。
重复以上操作直到20个字符全部被修改。
不过在解倒数三个字符串的时候会出现“[!] That formula cannnot be solved (UNSAT)”,本人对符号执行的理解甚少,还不知道为什么,希望在以后的学习里填上这个坑
0x03 总结
对于题目本身是不太难的,成文主要是想记录一下Ponce插件的使用,对于这个插件最基本的操作就是Ctrl+Shift+M设置符号,然后在关键跳转断下进行设置,当然这个插件是很强大的还有很多功能没有使用到。
|