CSAW-2012 Exploitation 200 Writeup
はじめに
Pwnの練習ということでこちらのサイトに関連する問題をちびちびやっていこうと思います. ただ,ksnctfの問題もあるのですべてをWriteupとして公開はしません. また,シェルの起動が一つのゴールであるとは思いますが,何が答えなのかいまいちわかっていません.
問題リンク
解析など
ファイルの確認
$ file exploitation1-release exploitation1-release: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-, for GNU/Linux 2.6.24, BuildID[sha1]=3884e99413d7610af414a6c12ce9ee0ed4933553, with debug_info, not stripped
- 32bitのELF
- 動的リンク
セキュリティ機構の確認
$ checksec.sh --file exploitation1-release
RELRO STACK CANARY NX PIE RPATH RUNPATH FILE
Partial RELRO No canary found NX enabled Not an ELF file No RPATH No RUNPATH exploitation1-release
STACK CANARY
がNo canary found
となっているため,BOFが狙えそうです.
シンボル情報の確認
$ readelf -r exploitation1-release 再配置セクション '.rel.dyn' at offset 0x550 contains 1 entry: オフセット 情報 型 シンボル値 シンボル名 0804aff0 00000c06 R_386_GLOB_DAT 00000000 __gmon_start__ 再配置セクション '.rel.plt' at offset 0x558 contains 28 entries: オフセット 情報 型 シンボル値 シンボル名 0804b000 00000107 R_386_JUMP_SLOT 00000000 setsockopt@GLIBC_2.0 0804b004 00000207 R_386_JUMP_SLOT 00000000 strcmp@GLIBC_2.0 0804b008 00000307 R_386_JUMP_SLOT 00000000 printf@GLIBC_2.0 0804b00c 00000407 R_386_JUMP_SLOT 00000000 __isoc99_fscanf@GLIBC_2.7 0804b010 00000507 R_386_JUMP_SLOT 00000000 inet_ntoa@GLIBC_2.0 0804b014 00000607 R_386_JUMP_SLOT 00000000 getuid@GLIBC_2.0 0804b018 00000707 R_386_JUMP_SLOT 00000000 htons@GLIBC_2.0 0804b01c 00000807 R_386_JUMP_SLOT 00000000 perror@GLIBC_2.0 0804b020 00000907 R_386_JUMP_SLOT 00000000 accept@GLIBC_2.0 0804b024 00000a07 R_386_JUMP_SLOT 00000000 waitpid@GLIBC_2.0 0804b028 00000b07 R_386_JUMP_SLOT 00000000 setgid@GLIBC_2.0 0804b02c 00000c07 R_386_JUMP_SLOT 00000000 __gmon_start__ 0804b030 00000d07 R_386_JUMP_SLOT 00000000 exit@GLIBC_2.0 0804b034 00000e07 R_386_JUMP_SLOT 00000000 __libc_start_main@GLIBC_2.0 0804b038 00000f07 R_386_JUMP_SLOT 00000000 bind@GLIBC_2.0 0804b03c 00001007 R_386_JUMP_SLOT 00000000 getgid@GLIBC_2.0 0804b040 00001107 R_386_JUMP_SLOT 00000000 fopen@GLIBC_2.1 0804b044 00001207 R_386_JUMP_SLOT 00000000 fork@GLIBC_2.0 0804b048 00001307 R_386_JUMP_SLOT 00000000 sigemptyset@GLIBC_2.0 0804b04c 00001407 R_386_JUMP_SLOT 00000000 freeaddrinfo@GLIBC_2.0 0804b050 00001507 R_386_JUMP_SLOT 00000000 listen@GLIBC_2.0 0804b054 00001607 R_386_JUMP_SLOT 00000000 setuid@GLIBC_2.0 0804b058 00001707 R_386_JUMP_SLOT 00000000 socket@GLIBC_2.0 0804b05c 00001807 R_386_JUMP_SLOT 00000000 getaddrinfo@GLIBC_2.0 0804b060 00001907 R_386_JUMP_SLOT 00000000 sigaction@GLIBC_2.0 0804b064 00001a07 R_386_JUMP_SLOT 00000000 recv@GLIBC_2.0 0804b068 00001b07 R_386_JUMP_SLOT 00000000 close@GLIBC_2.0 0804b06c 00001c07 R_386_JUMP_SLOT 00000000 send@GLIBC_2.0
listen
やaccept
が見えるのでfork-server型
の問題であると予想.
実行してみる
$ chmod +x exploitation1-release $ ./exploitation1-release
- へんじがない。
fork-server型
問題のようだ。
新しいタブを開き,確認してみます.
$ netstat -antp ... Proto 受信-Q 送信-Q 内部アドレス 外部アドレス 状態 PID/Program name tcp 0 0 0.0.0.0:54321 0.0.0.0:* LISTEN 2883/./exploitation ...
- ローカルの54321ポートでプロセスが待ち受けています.
繋いでみる
$ nc localhost 54321 Wecome to my first CS project. Please type your name:
- プログラムの動作を確認できました.
脆弱性さがし
逆アセンブルしてみる
200pt問題なので,key
の内容を読み出せばよいのかな?
脆弱性とかではなさそう.strcmp()
で入力した値とAAAAAAAAAAAAAAAAAAAAAAAAAA\n
を比較しています.
比較結果が正しくない場合,keyは読み出せない模様.
$ nc localhost 54321 Wecome to my first CS project. Please type your name: Maru
このページのkeyをお借りしてkeyファイルを作成します.
$ echo "b3ee1f0fff06f0945d7bb018a8e85127" > key
その後,AAAA...\n
を入力してみます.
$ nc localhost 54321 Wecome to my first CS project. Please type your name: AAAAAAAAAAAAAAAAAAAAAAAAAA b3ee1f0fff06f0945d7bb018a8e85127
ファイルの読み出し成功!
おわりに
key
の中身を読みだせたので200ptは獲得できたと予想.
おそらく,300pt・400ptと進んで行くと脆弱性をついてシェルを起動させると思います.
うん!きっとそう!...
たぶん...