angr을 이용한 문제였다. 

더럽게 길어서 오래걸리길래 처음에 안되는줄 알고 계속 인터럽트 걸어서 이상한데서 삽질햇다. 


ㅠ 선배님이 잘 안된다고 던져서 주섬주섬 주워서 풀고 있었는데 코드 짜고 테스트하던 찰나에 플래그를 따오셔서 좀 아쉬웠다.



import angr
project = angr.Project("./angrybird", load_options={'auto_load_libs':False})

s = project.factory.blank_state(addr=0x4007DA)
v = s.se.BVS('key', 100*8)
s.memory.store(0x606070, v)
rbp=s.regs.rbp
s.regs.rbp=0x606070+0x50+0x20
print s.regs.rbp
s.regs.rsp=s.regs.rbp-0x80
#s.regs.rsp=s.regs.rbp
#s.memory.store(s.regs.rsp, s.se.BVV(0, 8*0x100))
s.memory.store(s.regs.rbp, s.se.BVV(0, 8*0x100))
initpath = project.factory.path(state=s)
#ex = project.surveyors.Explorer( start=initpath, find=(0x404FAB))
#ex.run()
#print ex.found[0].state.se.any_str( ex.found[0].state.memory.load(0x606070, 21))

pg = project.factory.path_group(s)
target=0x404fab
target=0x400875
target=0x404f7c
#target=0x40084c
#target=0x4008cd
#target=0x40217e
def step_func(pg):
    pg.drop(filter_func = lambda path: path.addr == 0x4005E0)
    pg.stash(filter_func = lambda path: path.addr == target, from_stash='active', to_stash='found')
    return pg
pg.step(step_func = step_func, until = lambda pg: len(pg.found) > 0)
f = pg.found[0]
print f
cert = f.state.se.any_str(v)
print cert.encode('hex')
#print f.state.se.any_str( pg.found[0].state.memory.load(0x606070, 21))


'CTF' 카테고리의 다른 글

[codegate17 prequal]hello protector  (0) 2017.02.12
[codegate17 prequal]messenger  (0) 2017.02.11
[HITCON2014]stkof  (0) 2017.02.07
[codegate2016]bugbug  (0) 2017.02.02
[SECCON 2016]tinypad  (0) 2017.01.18

+ Recent posts