如何在Angr中使用“ stdin”

问题描述

我是 angr 的新手,试图解决一个简单的可执行文件,它读取3个字符并与字符串'abc'比较。

#include <iostream>
using namespace std;

int main() {
    char v[3];
    scanf("%3s",v);

    if(v[0] == 'a' && v[1] == 'b' && v[2] == 'c') { // should be 'abc'
        printf("yes\n");
    } else {
        printf("no\n");
    }
}

愤怒脚本:

import angr
import claripy

p = angr.Project("/e/c/1/kali/test")

main = p.loader.find_symbol('main')

# Question 1
# flag = claripy.BVS('flag',3*8)
# or
# flag = claripy.BVS('flag',4*8)

# Question 2
# flag_chars = [claripy.BVS('flag_%d' % i,8) for i in range(3)]
# flag = claripy.Concat(*flag_chars + [claripy.BVV(b'\n')])

state = p.factory.blank_state( 
    addr=main.rebased_addr,# stdin = flag,# uncomment this line when trying Question 1~3
)

sm = p.factory.simgr(state)

sm.explore(
    find = lambda s: b'yes' in s.posix.dumps(1),avoid = lambda s: b'no' in s.posix.dumps(1)
)

if sm.found:
    res = sm.found[0]
    print('found',res.posix.dumps(0))
else:
    print('not found')

当我没有为bland_state显式提供'stdin'时,它起作用。但是在提供“ stdin”时显示“未找到”。

  • 问题1:an example的语法,但是我的代码有什么问题?我尝试了3个和4个字节(“ \ n”为1个字节),但它们都不起作用。

  • 问题2:another example的语法,为什么它在示例中有效但在我的代码中无效?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...