2018年4月30日月曜日

Hacking:美しき策謀1

記録をつけると良いと聞いたので記録をつけます。
とりあえず「Hacking:美しい策謀 脆弱性攻撃の理論と実際」の第2版に取り組むことに。
環境はCygwin、gdbは多分元々入っていたはず。


 アクセス違反を確認する


 0x200のプログラミングの項目から飛ばし飛ばし。gdbを併用しながらC言語を学ぶみたいな項目です。わざとアクセス違反を起こすようなコードを書いて、デバッグ情報をつけてコンパイル(gcc -g)して、挙動を確認。

gdbは時々使っていたのですが、毎回コマンドを忘れる。
breakは関数名かアドレスかコードの行数で指定、但しアドレスを指定したいならアドレス頭に*をつけることを忘れない。メモリやレジスタの中身を確認したければexamineを略した x/(フォーマット)みたいな形でよさそう。
x/12i $ripとかにすると現在のアドレスから先が一気に確認できるので楽ですね(本は$eipだったのですがこの環境ではrでした、どうやら32bitと64bitの違いのようで)

レジスタを一気に確認したいときは info registersで、面倒ならi rで良し。

とりあえず実行するとstackdumpを吐いてくれるので、合わせて確認。

Exception: STATUS_ACCESS_VIOLATION at rip=00180197467
rax=00000001801FD9E0 rbx=0000000000000001 rcx=00000000FFFFD680
rdx=0000000000000000 rsi=000000000000000A rdi=0000000000000000
r8 =0000000000000000 r9 =000000000000000A r10=0000000100000000
Frame        Function    Args
00000000000  00180197467 (001004017D0, 00080808000, 000FFFFCBC0, 001801FD9E0)
000FFFFCBC0  001801976C5 (001802E6880, 0018021BF56, 000FFFFCC10, 00080808000)
000FFFFCBC0  0018017D3C1 (00080808000, 000FFFFCCC0, 000FFFFCC68, 00000000000)
000FFFFCBC0  0010040112E (000FFFFCC10, 300010F0100FF00, 00180047891, 00000000000)
000FFFFCCC0  00180047902 (00000000000, 00000000000, 00000000000, 00000000000)
00000000000  00180045693 (00000000000, 00000000000, 00000000000, 00000000000)

000FFFFFFF0  00180045744 (00000000000, 00000000000, 00000000000, 00000000000)
ブレークポイントを設定しつつ、rip=0x180197463に周辺を確認する。btでバックトレースを確認できる、デバッグ情報込みだからか名前も確認できる。本ではwhereで紹介されている。


(アドレスはstackdumpに書かれているものと同じ、だったらフレームってなんだろう)

ちなみにc-x 1で恰好いいモードに入れる。すごく恰好いい(けれどこれ使うならollydbg使った方が、という気持ちもある)

 問題個所は
movzx r13d,BYTE PTR[rbx-0x1]
の部分。実行前のrbxの値は0x1だったので計算すると0x0になり、これをアドレスにすると例外が入るという感じでしょうか。


そう言えば開始のアドレスってどう決まってるんだろう。


メモリのセグメント化

 スタックは高いから低い方向に成長する。rspがスタックポインタでrbpがベース子インタ。だからスタックが成長する時は、rbpをpushして、rspの値をrbpに押し込んでから、rspの値が引き算されることになる。下位から上位への流れの順に、rbp押し込み、各変数、callによる戻りアドレス書き込みがあって、呼び出し先でまたrbpの押し込み、変数…とやっているみたい。

セグメントは上位アドレスから順にテキスト(コード)、データ、bss、ヒープ、スタックという順とのこと。テキストは書き込み禁止にすることで、意図せぬ書き換えを防止する効果がある。
bssは初期化しなかった変数格納用で、ヒープはmallocとかの。アドレスの高い低いも重要情報の一つっぽい。

後はファイル管理やUNIXのユーザシステム周りだったので、そこそこに読んで、関数ポインタの話へ。運だめしゲーム面白かった。








0 件のコメント:

コメントを投稿