как использовать 'stdin' в angr

Я новичок в 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");
    }
}

AnGR скрипт:

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')

Это работает, когда я явно не указываю stdin для bland_state. Но он показывает "не найден", если указан "stdin".

  • Вопрос 1: синтаксис из примера, но что не так с моим кодом? Я пробовал как 3, так и 4 байта (1 для '\n'), ни один из них не работает.

  • Вопрос 2: синтаксис из другого примера, почему он работает в этом примере, а мой код - нет?

0 ответов

Другие вопросы по тегам