株式会社Ninjastars
セキュリティエンジニア:一瀬健二郎
今回は通称ハリネズミ本と呼ばれる、「セキュリティコンテストチャレンジブック -CTFで学ぼう! 情報を守るための戦い方」のpwnの項目について書かせていただきます。
素晴らしい内容の本ですが、独学で学ばれてる方などの場合躓いてしまう部分などもあると思うため補助的な解説をさせていただきます。
相違点
gdb-peda
python3の対応も進んだので、longld/pedaを利用します。
gdb-peda超入門 - Qiita
バッファオーバーフロー時の挙動
本の通りのpayloadだとmain関数内でbofを発生させると上手くeipが書き変わらないようです。
bofさせる処理を関数化しましょう。
バッファオーバーフローでeipが書き換えられない - fr33f0r4ll
#include <stdio.h> void bof(){ /* バッファオーバーフローさせる処理を書く。 */ return; } int main(int argc, char** argv){ { bof(); return 0; }
バッファオーバーフローについては当ブログでも記事にしています。
ソフトウェアバグ -Segmentation Fault- - 株式会社Ninjastars 技術研究部
gccのコンパイルオプション
gccのver7.4.0ではコンパイル時のデフォルトの挙動が変わっています。
・PIEについて
デフォルトでPIEが有効になっているため「-no-pie」オプションをつける必要がある。
gcc -m32 -no-pie -fno-stack-protector -o bof3 bof3.c
・RELROについて
gccのデフォルトではFull RELROとなりますが、-no-pieを付ければPartial RELROとなるためGOT Overwriteは実行可能です。
gccのオプションとセキュリティ機構の関係は下記の方のブログを参照ください。
セキュエン備忘録: [Linux] GCCのオプションとセキュリティ機構の関係
当ブログの記事でもgccのコンパイルオプションについて説明しています。
自作ゲーム:チートチャレンジ2 - 株式会社Ninjastars 技術研究部
Tips
pattoのoffsetについて
gdb-peda$ patto AFAA AFAA found at offset: 44
pattoのオフセットの位置は0から始まっています。
オフセットが44の場合最初の'A'は44文字です。
objdumpについて
最初はオプションが難しく感じるかもしれません。
コマンドのオプションの意味を理解し、覚えてしまいましょう。
Man page of objdump
ret2pltが分からない
sample.c
//gcc -m32 -no-pie -fno-stack-protector -o sample sample.c #include<stdio.h> char buffer[32]; int main(int argc,char * argv[]) { fgets(buffer,32,stdin); printf(buffer); return 0; }
理解のために、上記サンプルを例にします。
gdbでsampleを動かしてみましょう。
gdb -q sample b printf@plt r //標準入力からhelloと入力
0x80484bc (<main+70>: add esp,0x10)
スタックの最初に積まれている上記部分は、call命令でprintf@pltを呼び出した次の命令となります。
つまり正常にprintf@pltを呼び出したときのスタック状態は
リターンアドレス(printf@pltから戻った時の、次の命令のアドレス)
引数1
ret2pltは上記を再現しているという訳です。
ここで重要なのは何かわからない部分があったら実際に手を動かしてみる、理解できるまで可能な範囲で考えてみるというアプローチの仕方であると思います。
注意事項
本レポートに記載されている内容を許可されていないソフトウェアで行うと、場合によっては犯罪行為となる可能性があります。そのため、記事の内容を試す際には許可されたソフトウェアに対してのみ実施するようにしてください。
本レポートについて
お問い合せ
E-mail:ichise@ninjastars-net.com
株式会社Ninjastarsエンジニア
一瀬健二郎