본문 바로가기
Rev/Write-up

Christmas CTF 2020 - angrforge

by zooonique 2021. 1. 4.
반응형

이 문제는 분석보다는 기존에 나와있는 라이트업을 통해 angr의 활용방법을 정리하는 방법으로 진행한다.

 

angr의 설치와 사용방법은 간단하게 zooonique.tistory.com/26 여기에 정리를 해뒀다.

 

구글링해보면 더 좋은 글들이 많다!

 

바이너리를 실행시키면, 57자리의 input을 받고 제대로 입력을 하면,

"OMG, Thank you for your good works :)"이 출력된다.

 

더보기
import angr
import claripy

def main():
    p = angr.Project('angrforge')

    # 8비트 즉 1바이트의 심볼릭 비트벡터를 57개 만들어준다.
    flag_chars = [claripy.BVS('flag_%d' % i, 8) for i in range(57)]
    
    #개행 추가
    flag = claripy.Concat(*flag_chars + [claripy.BVV(b'\n')])
    
    
    # _init 지점에서 시작을 하도록 셋팅하고 unicorn옵션을 줌으로서 코드풀기 속도가 향상된다.
    
    st = p.factory.full_init_state(
            add_options=angr.options.unicorn,
            stdin=flag,
    )
    
    #st.solver.add 문법 자체가 제약조건을 추가해는것 같다. 자료가 많이없음.
    #57개의 플래그안에 null 이나 개행이 없도록 한다.
    #벡터 하나하나 무엇이 들어갈지 모르는 상황에서 그 벡터안에 아래의 조건이 들어가지 못하게 사전에 막는다?
    for k in flag_chars:
        print(st.solver)
        st.solver.add(k != 0)
        st.solver.add(k != 10)

    #시뮬레이션 메니저 구성한다.
    sm = p.factory.simulation_manager(st)
    sm.run()
    
    
    
    out = b''
    for pp in sm.deadended: #deadended 상태가 될때까지 진행한다.
        out = pp.posix
        if b'OMG' in out.dumps(1): #1은 표준출력
            print(out.dumps(0)) # 0은 표준 입력


if __name__ == "__main__":
    print(main())
    
    
 # 출처 : 박승현

 

반응형

'Rev > Write-up' 카테고리의 다른 글

HTB - headache  (0) 2021.01.11
HTB - BombsLanded  (0) 2021.01.07
Christmas CTF 2020 - Screw_Driver  (0) 2020.12.30
Christmas CTF 2020 - lock  (0) 2020.12.28
b01lers - chuggachugga  (0) 2020.03.18