angr_命令行输入

https://blog.csdn.net/qq_33438733/article/details/80315245

Crack

  • 题目链接https://github.com/fangdada/learning-angr/blob/master/%E5%91%BD%E4%BB%A4%E8%A1%8C%E8%BE%93%E5%85%A5/fake

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

你可能感兴趣的:(angr_命令行输入)