株式会社Ninjastars 技術系ブログ

「本質的安全を提供し、デジタル社会を進化させる!!!」

pwnの歩き方 ハリネズミ本を読む

株式会社Ninjastars
セキュリティエンジニア:一瀬健二郎

今回は通称ハリネズミ本と呼ばれる、「セキュリティコンテストチャレンジブック -CTFで学ぼう! 情報を守るための戦い方」のpwnの項目について書かせていただきます。
素晴らしい内容の本ですが、独学で学ばれてる方などの場合躓いてしまう部分などもあると思うため補助的な解説をさせていただきます。

f:id:Ninjastars:20190719034811j:plain

環境

Ubuntu 18.04 LTS 64bit 日本語版
gcc version 7.4.0

Ubuntugccのverが新しくても幾つか気を付ければ問題なく学習が可能です。

相違点

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 技術研究部

C言語について

プログラミングにまだ慣れていないC言語初学者には、弊社では北ソフト工房様の「C言語 練習問題集」をまず一通り勉強してもらいます。
C言語 練習問題集

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と入力

f:id:Ninjastars:20190719042705p:plain
printf@pltに到達したときのスタックの状態

0x80484bc (<main+70>:	add    esp,0x10)

スタックの最初に積まれている上記部分は、call命令でprintf@pltを呼び出した次の命令となります。
つまり正常にprintf@pltを呼び出したときのスタック状態は

リターンアドレス(printf@pltから戻った時の、次の命令のアドレス)
引数1

ret2pltは上記を再現しているという訳です。
ここで重要なのは何かわからない部分があったら実際に手を動かしてみる、理解できるまで可能な範囲で考えてみるというアプローチの仕方であると思います。

注意事項

本レポートに記載されている内容を許可されていないソフトウェアで行うと、場合によっては犯罪行為となる可能性があります。そのため、記事の内容を試す際には許可されたソフトウェアに対してのみ実施するようにしてください。

本レポートについて
お問い合せ
E-mail:ichise@ninjastars-net.com

株式会社Ninjastarsエンジニア
一瀬健二郎