b.a.b.y.r.e.
64bitのexecutableで13文字のパスを訊くだけのプログラム
とりあえずradareでみてみたところCheckSolutionが本体っぽい
ということでみてみると
嗚嗚嗚嗚嗚嗚アアアアアアアアああああああああああああああああああああああああああああああああああああああああああああw
どうも入力されたcharacterをごちゃごちゃ変換してflagにしてるようだが
こんな感じのが延々と続いている
これを全て丁寧に解析するなんてのは*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)
実行すると
となり、flag = Math is hard!
正直angrはよくわかってないし自分で書いた↑を見返してもBSSにBVSを置いた辺りで???ってなる・・
*1:☛(◜◔。◔◝)☚