angr_命令行输入

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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容