-
-
IDA插件Ponce的使用
-
发表于:
2022-2-4 19:44
10133
-
Ponce是一款使用C/C++开发的IDA Pro插件,它使用户能够以简单直观的方式对二进制文件执行污点分析和符号执行。
Ponce的github地址:https://github.com/illera88/Ponce
我的环境:
在github仓库的release界面下载文件(windows平台下是ponce.dll和ponce64.dll)并复制到IDA安装目录的plugins文件夹即可使用。
使用模式:
示例文件:crackme_xor.exe,源代码在https://github.com/illera88/Ponce/blob/master/examples/crackme_xor.cpp,当命令行参数为正确密钥“elite”时程序会输出Win
,否则输出fail
将示例文件crackme_xor拖入ida打开
F9(或Debugger-->Select debugger...)
选择Local Windows debugger
Debugger-->Process options,设置启动参数为“aaaaa”
打开关键函数check(char *)
的反汇编窗口,找到对应源代码for循环的关键跳转判断语句.text:0000000000401577 jz short loc_401580
(确定check函数到底是返回1还是0)
F2下断点
在Edit-->Ponce-->show config中,没有找到官方教程中的Taint argv选项,因此为了symbolize输入参数以生成解决方案,需要先找到输入参数所在的内存地址,再使用ponce标记它
分析check函数对应的反汇编代码可知,参数char *s地址在rcx寄存器,通过mov [rbp+ptr], rcx
被复制到栈上参数ptr对应的位置,因此在该命令下断点
(此时一共下了两个断点,分别是关键跳转语句和参数地址语句)
F9(或Debugger-->Start process)开始调试
程序运行到第一个断点,此时rcx寄存器内的值是0x0000000000BA1570,跳转到该地址查看数据,发现确实是输入的参数字符串“aaaaa”
ctrl+shift+m,symbolize数据
F9(或Debugger-->continue process)运行到下一个断点
此时不断闪烁的边是程序即将跳转的分支。由于输入参数的第一个字符是'a'而非正确的密钥字符'e',因此接下来将执行return 1的代码
右键断点位置-->SMT Solver--> Negate and Inject
重复上述过程,SMT求解得到正确密钥elite
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!