b.a.b.y.r.e.

64bitのexecutableで13文字のパスを訊くだけのプログラム

 

とりあえずradareでみてみたところCheckSolutionが本体っぽい

ということでみてみると

嗚嗚嗚嗚嗚嗚アアアアアアアアああああああああああああああああああああああああああああああああああああああああああああw

gyazo.com

どうも入力されたcharacterをごちゃごちゃ変換してflagにしてるようだが

gyazo.com

こんな感じのが延々と続いている

これを全て丁寧に解析するなんてのは*1

のでangrを使うと、

import angr

p = angr.Project("./re")

s = p.factory.blank_state(addr = 0x4028e0)

#checksokutionのaddr

re = s.se.BVS("re", 32*13)    

 #パスの長さである13文字分のsymbolic memoryをBSS(0x602e10~)に保存

s.memory.store(0x602e10, re)

s.regs.rdi = 0x602e10    

#first argumentであるrdiにポイントさせる

pg = p.factory.path_group(s)

pg.explore(find=0x40294b, avoid=0x402941)

#findはprintfの先のたどり着きたい場所 avoidはパスが間違っていた際に飛ばされる場所

 

print "flag is: %r" % pg.found[0].state.se.any_str(re)

実行すると

gyazo.com

となり、flag = Math is hard!        

 

正直angrはよくわかってないし自分で書いた↑を見返してもBSSにBVSを置いた辺りで???ってなる・・

*1:☛(◜◔。◔◝)☚