https://blog.csdn.net/qq_33438733/article/details/80315245
Crack
IDA伪代码
int __cdecl main(int argc, const char **argv, const char **envp)
{
int result; // eax
if ( argc == 2 )
{
if ( (unsigned int)verify((__int64)argv[1]) )
puts("Correct! that is the secret key!");
else
puts("I'm sorry, that's the wrong secret key!");
result = 0;
}
else
{
puts("You need to enter the secret key!");
result = -1;
}
return result;
}
脚本及注释
import angr
import claripy
p = angr.Project("./crack")
argv1 = claripy.BVS("argv1", 100 * 8) # 构造了100个字节(不知道真实值的长度,所以大一点)
initial_state = p.factory.entry_state(args=["./crack", argv1]) # 构造程序入口点的参数 ,第一个是filename,第二开始是程序参数
sm = p.factory.simulation_manager(initial_state) # 从入口点出创建一个模拟器来进行符号执行
sm.explore(find=0x400602)
found = sm.found[0]
solution = found.solver.eval(argv1, cast_to=bytes) # 获得正确结果中相对应的argv1符号的值,转换成bytes. cast_to支持的类型有int和bytes
print(bytes.decode(solution).strip('\x00')) # 先解码转换成str,再去掉\x00
- res.found[0].posix.dumps(0)代表该状态执行路径的所有输入
- res.found[0].posix.dumps(1)代表该状态执行路径的所有输出
- 使用
p.factory.entry_state
定义入口传入参数 -
cast_to
支持的类型有 int 和bytes