Pwn

csapp攻撃ラボレベル5



Csapp Attack Lab Level5



最初のROPが終了したら、2番目のROPを見てみましょう。もちろん、これは明らかに難しいです。
画像
明らかにこれはtouch3と同じですが、注入できないため、ガジェットに接続するためにretを使用することしかできません。私は最初の提案に戸惑いました、それでなぜ私はmovlをレビューする必要があります。この関数をファームから分解するまで、使用できる手順は本当に哀れです。図に示すように、grepはキーワードを取得し、下のグラフを比較して、使用できるコマンドが少なすぎることを確認します。
画像
関連する表に従って、修飾された命令がキャプチャされます。
画像
次に、利用可能なすべての手順を要約します
画像
したがって、これらの手順を使用してこの実験を完了するには、最も重要なのはlea(%rdi、%rsi、1)、%raxです。
スタックアドレスのランダム化がオンになっていて、文字列が格納されているアドレスを特定できないため、もちろん、%rdi =%rsp + offsetaddressを使用して文字列のアドレスを表すことも考えられます。 (Lea(%rdi、%rsi、1)、%raxはこの命令によって決定され、rsiはオフセットアドレスを格納するようになりました)
この命令はfarm.cです。
画像
これは、valにちなんで名付けられていない唯一の関数です。
lea(%rdi、%rsi、1)、%raxは、%rax =%rdi +%rsiを意味します。
これに
1. rdiレジスタの内容は、rspのアドレスです。
2. rsiの内容は、オフセットアドレスの値です。
3. movq%rax、%rdiを実行した後、rdi = rsp + offsetを取得できます。
示されているように
これが私が書いたプロセス全体です
画像
ファームの逆アセンブル命令にはmovq%rax、%rsi命令がないため、movleaxのみを使用できます。
当時、オフセットは80バイトだといつも思っていたので、エラーを報告し続けていました。よく見てみました。最初の命令はリターンアドレスであり、スタックの最上位ではありません。これは、2番目の命令が文字列に到達する前のみです。 72バイトは0x48です
最後に書く
画像
成功
画像