196の日記

セキュリティ系の勉強、その他開発メモとか雑談、忘れそうな計算式などを書き溜める場所になっています. githhubはUnity触っていた頃ものがメイン https://github.com/196kakinuma

get_thread_contextで取得したレジスタの値が0x00000000 ~リバースエンジニアリング pythonによるバイナリ解析

タイトル通りです。前回はデバッグ対象が64bitであったのに対し、pythonが32bitであったためデバッグが上手く出来なかったという案件でした。

今回はその続きなので、3章についてです。


今回の原因も32bitと64bitの違いが原因

CTFの勉強やバイナリ解析の勉強を少しでもやった方ならなんとなく閃けるのかもしれません。よくよく考えれば、アーキテクチャによってレジスタの名前が変わるよ!という内容をやった気がすると思うのですが、今回はこれが足がかりに。

結果的には、64bitのアプリケーション用のコンテキストを作ってあげなければいけませんでした。


解決策

まず、定義に以下を追加してください。すでに書籍にある部分は省略している部分があるので、気をつけてください。

また、get_thread_context()実装部分は主に以下のように修正していただければおそらくOK.
ついでにmy_test.pyでの出力部分も修正してしまいましょう。

#get_thread_context()
context = CONTEXT64()
_________________

#my_test.py
print "[**] RAX: 0x%08x" % thread_context.Rax

変数名が違うので見たいレジスタ名に変更してください。





多少古い本なので、今買うのはあまりオススメはしないかもです。