Ponce
功能概括:
污点追踪&符号执行(IDA插件)
功能详解:
1.符号执行
符号执行的结果得到到达target时输入应该满足的约束条件,并验证约束条件能否满足。
2.污点追踪
大的程序,符号执行所遍历的路径太多。用以原始输入为指导简单路径选择算法,较快的达到程序深处。
3.符号执行&污点追踪->concolic模式
输入,跟踪程序执行路径,到约束点生成相应的输入约束表达式,验证约束表达式能否满足,对约束表达式进行约束求解得到新的数据(断点处选择Negate&inject,得到原先输入的“相反版本”)
不足:
目前只适用于windows平台&构建过程复杂
4.程序:验证序列号的过程
Crackme1.cpp(追踪&符号化执行)
#include <stdio.h>
#include <stdlib.h>
char *serial = "guess";
int check(char *ptr){
int i = 0;
while (i < 5){
if (ptr[i]!= serial[i]) return 1; //fail
i++;
}
return 0;
}
int main(int argc, char **argv){
if (argc != 2) return -1; //fail
if (check(argv[1]) == 0)
printf("win\n");
else
printf("fail\n");
system("pause");
return 0;
}
结果:Solution found
Crackme2.cpp(追踪&符号化执行&限制条件有矛盾)
#include <stdio.h>
#include <stdlib.h>
char *serial = "guess";
int check1(char *ptr){
int i = 0;
while (i < 5){
if(ptr[i] != serial[i]) return 1; //fail
i++;
}
return 0;
}
int check2(char *ptr){
if(ptr[0] == serial[0]) return 1; //fail && 无法符号化得到答案
return 0;
}
int main(int argc, char **argv){
if (argc != 2) return -1; //fail
if (check1(argv[1]) == 0 && check2(argv[1]) == 0)
printf("win\n");
else
printf("fail\n");
system("pause");
return 0;
}
结果:No solution found
安装与操作
都很好找~