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

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

新規登録して質問してみよう
ただいま回答率
85.48%
アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

C

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

GDB

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

セキュリティー

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

Q&A

解決済

1回答

4494閲覧

スタックバッファオーバーフローを用いたexploitコードの作成

omiteratail

総合スコア19

アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

C

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

GDB

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

セキュリティー

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

0グッド

2クリップ

投稿2017/10/23 07:56

###前提・実現したいこと
現在セキュリティの勉強をしており、C言語のスクリプトにある脆弱性(スタックバッファオーバーフロー)を用いてexploitコードを作りたいです。

デバッガであるGDBを用いてC言語スクリプトのアセンブリを分析して、shellコード(こちらは作成済みなので大丈夫です,shellcode.h)を引数として送って実行させ,ルートのシェルを起動させるというexploitコードをC言語で書きたいです。

スタックバッファオーバーフローによってshellコードの先頭アドレスにリターンさせるようにすることで、shellコードを実行させられるということだと思うのですが、
shellコードの先頭アドレスはどうやって求めれば良いのか。
そもそもこの解釈で当たっているのか。
当たっていなければどうやってshellコードを実行させるのか。
ということが知りたいです。
環境はLinuxで、ASLRやSSPなどのセキュリティ機構は特にありません。

言葉足らずの箇所も多々あると思いますので、その都度ご質問いただければと思います。
お手数ですが、よろしくお願いいたします。

###該当のソースコード
以下が脆弱性のあるソースコードtarget.c
こちらは特にいじりません。

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5void strcpyn(char *out, int outl, char *in) 6{ 7 int i, len; 8 9 len = strlen(in); 10 if (len > outl) 11 len = outl; 12 13 for (i = 0; i <= len; i++) 14 out[i] = in[i]; 15} 16 17void fuga(char *arg) 18{ 19 char buf[101]; 20 21 strcpyn(buf, sizeof buf, arg); 22} 23 24void hoge(char *argv[]) 25{ 26 fuga(argv[1]); 27} 28 29int main(int argc, char *argv[]) 30{ 31 if (argc != 2) 32 { 33 fprintf(stderr, "target: argc is not 2\n"); 34 exit(EXIT_FAILURE); 35 } 36 hoge(argv); 37 return 0; 38} 39

以下は攻撃に用いるexploitコードの骨組みです。
以下を用いてexploitコードを作りたいです。
こちらが今回いじるコードです。

c

1 2 3#include <stdio.h> 4#include <stdlib.h> 5#include <string.h> 6#include <unistd.h> 7#include "shellcode.h" 8 9#define TARGET "/target" 10 11int main(void) 12{ 13 char *args[3]; 14 char *env[1]; 15 16 args[0] = TARGET; args[1] = "何かしらの値"; args[2] = NULL; 17 env[0] = NULL; 18 19 return 0; 20}

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

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

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

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

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

guest

回答1

0

ベストアンサー

この条件でそもそもバッファオーバーフロー起きないです。
脆弱性が有るとはいえません。

C

1 if (len > outl) 2 len = outl;

正しく脆弱性を作るなら、こう。
(一番簡単な例です。他にも作り用は有りますが、簡単のため割愛します。)

C

1void strcpyn(char *out, int outl, char *in) 2{ 3 int i, len; 4 len = strlen(in); 5 for (i = 0; i <= len; i++) 6 out[i] = in[i]; 7}

その上で、libc内にあるsystem関数などを叩くとシェルを奪えます。
ASLRがないとのことなので、libcのアドレスの推測は非常に簡単です。
printf関数からの相対オフセットを計算して
引数("/bin/sh\0")へのポインタをBOF使ってセットして、system関数に飛ばしてやるだけです。

ASLRが有る場合は、ROPつかってやるだけなので手順はそんなに変わりません。
libcのアドレス推測はASLRがある場合は、インフォメーションリーク系の脆弱性
(Format string bug等)を組み合わせることによって
メモリアドレスのリークをし、その後オフセット計算を行いExploitする。

と言う手順が必要です。ただ面倒になるだけでやる事の本質は同じです。
ASLRが無い場合は、配置される仮想アドレスが固定アドレスなので、推測は非常に容易です。
バイナリが手元にある場合はその配置先のアドレスは readelf コマンドで確認できます。
以上。

投稿2017/10/23 09:47

v_v

総合スコア47

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

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

omiteratail

2017/10/23 17:35

v_v さん 丁寧かつ迅速なご回答ありがとうございます。 当方、勉強不足で大変申し訳ないのですが、 """ libcのアドレスの推測は非常に簡単です。 printf関数からの相対オフセットを計算して 引数("/bin/sh\0")へのポインタをBOF使ってセットして、system関数に飛ばしてやるだけです。 """ という部分をもう少し詳しく教えていただけると理解が深まります。。。 インターネットで調べてみてもいまいちわかりませんでした。。。 お手数をおかけしてしまい申し訳ございませんが、よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問