Ponce是一款使用C/C++开发的IDA Pro插件,它使用户能够以简单直观的方式对二进制文件执行污点分析和符号执行。
Ponce的github地址:f3eK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6A6L8r3I4W2M7X3p5^5z5q4)9J5c8W2m8G2L8X3y4W2
我的环境:
在github仓库的release界面下载文件(windows平台下是ponce.dll和ponce64.dll)并复制到IDA安装目录的plugins文件夹即可使用。
使用模式:
示例文件:crackme_xor.exe,源代码在b9fK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6A6L8r3I4W2M7X3p5^5z5q4)9J5c8W2m8G2L8X3y4W2i4K6u0r3j5X3I4G2j5W2)9J5c8X3#2S2M7%4c8W2M7W2)9J5c8X3g2^5j5h3#2H3L8r3g2K6i4K6u0r3j5%4u0S2j5$3E0E0k6g2)9#2k6Y4S2G2M7W2)9J5k6h3y4H3M7l9`.`.,当命令行参数为正确密钥“elite”时程序会输出Win,否则输出fail
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)
check(char *)
.text:0000000000401577 jz short loc_401580
F2下断点
在Edit-->Ponce-->show config中,没有找到官方教程中的Taint argv选项,因此为了symbolize输入参数以生成解决方案,需要先找到输入参数所在的内存地址,再使用ponce标记它
分析check函数对应的反汇编代码可知,参数char *s地址在rcx寄存器,通过mov [rbp+ptr], rcx被复制到栈上参数ptr对应的位置,因此在该命令下断点
mov [rbp+ptr], rcx
(此时一共下了两个断点,分别是关键跳转语句和参数地址语句)
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
elite
[培训]科锐逆向工程师培训第53期2025年7月8日开班!
@ueverhttps://bbs.pediy.com/upload/attach/202202/946004_JGE3APG78MNKY97.png
图中的这个有一个bug,顺序能否调整成正确的? 要是钥匙长度是100位呢? 不得神经?另外,是否支持 数据 合并成一行的功能? 这样看着不直观啊。
简单修改2处,不就更进一步了?
ninebell @ueverhttps://bbs.pediy.com/upload/attach/202202/946004_JGE3APG78MNKY97.png图中的这个有一个bug,顺序能否调整成正确的?&a ...
uever 试了几次顺序都是混乱的,不知道是不是我哪里操作不对
ninebell c2cK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3f1#2x3Y4m8G2K9X3W2W2i4K6u0W2j5$3&6Q4x3V1k6@1K9s2u0W2j5h3c8Q4x3X3b7I4y4e0R3K6y4o6x3$3i4K6u0V1x3g2)9J5k6o6q4Q4x3X3g2Z5N6r3#2D9 我给找来个明白人,不知有没有帮助? 学习下吧。