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 |