1、介绍
Ponce是一款使用C/C++开发的IDA Pro插件,它使用户能够以简单直观的方式对二进制文件执行污点分析和符号执行。
https://github.com/illera88/Ponce
下载Release里面,根据系统决定下载哪一个
安装方法也很简单:
Ponce works with both x86 and x64 binaries in any IDA version >= 7.0. Installing the plugin is as simple as copying the appropiate files from the latest builds to the plugins\
folder in your IDA installation directory.
作为2016年IDA插件大赛获奖者,该插件应用的范围可以看到很广泛,毕竟是符号模拟插件
2、练习
https://github.com/illera88/Ponce/tree/master/examples
这是官方给我们提供的练习程序,我们使用crackme_xor.cpp
#include <stdio.h>
#include <stdlib.h>
const char *serial = "\x31\x3e\x3d\x26\x31";
int check(char *ptr)
{
int i = 0;
while (i < 5){
if (((ptr[i] - 1) ^ 0x55) != serial[i])
return 1;
i++;
}
return 0;
}
int main(int ac, char **av)
{
int ret;
if (ac != 2)
return -1;
ret = check(av[1]);
if (ret == 0)
printf("Win\n");
else
printf("fail\n");
return 0;
}
打开程序
自动弹出Ponce的配置页面
进入main函数
ponce需要动态运行,所以还需要配置一下
接下来需要在关键比较的地方下断点:
1、符号化关键比较
2、符号化关键数据
动态运行,在[ebp+input]的地方断下来
符号化,也可以使用快捷键
确定
再次运行,此时不断闪烁的边是程序即将跳转的分支
接下来右键关键比较的地方
创建SMT模拟
右键断点位置-->SMT Solver--> Negate and Inject
发现是成功得到了结果
不断重复过程
跳转到另一边,然后再运行
美中不足的是每次动态调试都要重新设置符号变量
不过用起来真的很爽
3、2023N1CTF-addtion plus
废话不多说,IDA打开分析即可
生成的假flag
111111111111111111111111111111111111111111111111
这是动态调用加密函数,call一个地址
该函数极大,单纯分析的话,真的费时间。
预期解为使用z3模式求解
会调用0x30次,说明对输入的每一个flag进行加密
继续分析,找到关键比较的地方
可以看到是每16字节进行比较,正好分为了3部分
如果同时爆这48位,很难爆出,我们缩减思路,每8位进行爆破,因为加密的时候就是每8个字节进行加密的(8个字节为一组,依次调用不同的加密的函数)
对第一块比较进行分析
8字节爆破,需要修改一些东西
修改完成后就达到了8字节爆破的目的
先符号化前8位
需要进行简单patch,这里需要注意的是远程Linux拷贝的文件,需要进行删除,然后重新copy!
之后的效果如下:
等待大概20分钟,虽然很方便,但是很费时间
期间弹出的窗口还是点击确认
前8位爆破要了半小时
后面比较中间 17-32的时候,需要将加密的起始位置修改为17开始,相同的操作,就是很费时间。
总结:
使用ponce,我们需要标记(符号化)
1、关键数据地址
2、关键比较
然后就静等片刻咯