我创建了以下 c 程序作为概念证明。当我试图用愤怒来分析它时,它永远不会结束。
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
char *secret = "password";
int compare(char *string)
{
int i, c=0;
for (i=0; i< strlen(secret); i++)
{
if (string[i] == secret[i])
c++;
}
if (c == 8)
printf("You won");
return 0;
}
int main(int argc, char **argv)
{
char input[50];
scanf("%s", input);
compare(input);
return EXIT_SUCCESS;
}
脚本如下:
#!/usr/bin/env python
import angr
import sys
import logging
import claripy
FIND = 0x00000000000011dd
LEN = 8
def basic_symbolic_execution():
p = angr.Project('test', load_options={'auto_load_libs':False})
flag = claripy.BVS('flag', LEN * 8)
st = p.factory.entry_state(
stdin=flag,
)
sm = p.factory.simulation_manager(st)
sm.explore(find=FIND, num_find=1)
print("Found solution")
out = b''
for pp in sm.deadended:
out = pp.posix.dumps(1)
print(out)
import IPython; IPython.embed()
def test():
r = basic_symbolic_execution()
if __name__ == '__main__':
sys.stdout.buffer.write(basic_symbolic_execution())
我还尝试在 c++ 的地址上使用 explore 8 次,然后检查 stdin 并完成,但结果全为零。我想知道你们中是否有人遇到过类似的事情,以及你们的解决方案是什么。