Angr in funtion in the middle and additional restriction
우리가 흔히 c 언어로 된 코드에서 중간에 특정부분을 지나서 특정 메모리 부분에 원하는 값을 넣고 싶을때가 있다.
이럴때 중간에 특정부분이 계산하기 납잡하게 되어 있다면, 이 코드 구현을 따라하면 된다.
일단 기본적인 구현은 다음글과 같다.
변화가 생긴 부분은
C
def is_good(s):
if s.addr != success_addr:
return False
buf_mem = s.memory.load(FRAME_RBP + BUF_OFFSET, INPUT_N)
ok = s.solver.satisfiable(extra_constraints=[buf_mem == claripy.BVV(DESIRED)])
if not ok:
return False
# 락인: 이제 진짜 제약을 상태에 "추가"해서 해가 고정되도록
s.add_constraints(buf_mem == claripy.BVV(DESIRED))
return True
simgr = p.factory.simulation_manager(state)
simgr.explore(find=is_good, avoid=[fail_addr])
if simgr.found:
st = simgr.found[0]
input_model = st.solver.eval(sym_stdin, cast_to=bytes)
model = st.solver.eval( st.memory.load(FRAME_RBP + BUF_OFFSET, INPUT_N), cast_to=bytes)
print("[+] Found result:", model)
print("[+] Found input:", input_model)
print(len(input_model))다음 부분인데, find=success_addr 에서 find=is_good 으로 함수로 바뀌었다. 따라서 success_addr에 도착을 했을때 특정 조건이 만족을 해야 하게 바뀌었다.
C
def is_good(s):
if s.addr != success_addr:
return False
buf_mem = s.memory.load(FRAME_RBP + BUF_OFFSET, INPUT_N)
ok = s.solver.satisfiable(extra_constraints=[buf_mem == claripy.BVV(DESIRED)])
if not ok:
return False
# 락인: 이제 진짜 제약을 상태에 "추가"해서 해가 고정되도록
s.add_constraints(buf_mem == claripy.BVV(DESIRED))
return True다음 함수는 보면
buf_mem = s.memory.load(FRAME_RBP + BUF_OFFSET, INPUT_N) 으로 특정메모리의 특정 부분을 가져온뒤
ok = s.solver.satisfiable(extra_constraints=[buf_mem == claripy.BVV(DESIRED)])
이 코드를 통해 해당 가능한지 판독하고 가능하면,
s.add_constraints(buf_mem == claripy.BVV(DESIRED))
해당 제약을 추가해주면 된다. 그러면, 이제 해당 메모리가 success_addr에 도착했을때 제약조건과 같아야 한다.