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

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

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

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

OS

OS(オペレーティングシステム)は、システムソフトウェアの一種であり、一般的に、ハードウェアを直接的に管理・操作する最も中心的な機能を有するソフトウェアがオペレーティングシステムとして呼ばれます。

Q&A

3回答

1411閲覧

スタック領域 入力の順番について

tsuyoku-naritai

総合スコア7

アセンブリ言語

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

OS

OS(オペレーティングシステム)は、システムソフトウェアの一種であり、一般的に、ハードウェアを直接的に管理・操作する最も中心的な機能を有するソフトウェアがオペレーティングシステムとして呼ばれます。

0グッド

0クリップ

投稿2021/05/14 09:55

スタック領域で例えばabcdefghと入力して記憶されるとき
リトルエンディアンなのでメモリのアドレスは小さいほうからhgfedcbaと記憶されると思っていました。
以下のようなプログラムで

C

1#include <stdio.h> 2#include <string.h> 3 4int main(void){ 5 char a[] = "password"; 6 char b[] = "passcode"; 7 char ab[10]; 8 scanf("%s", ab); 9 if(strcmp(a,b)==0) 10 printf("改ざんされました\n"); 11 else 12 printf("正常です\n"); 13 return 0; 14}

abcdefghijpasswordと入力すればバッファオーバーフローが起きると思います。
しかし、自分はリトルエンディアンなんだからabcdefghijdrowssapと入力しないとバッファオーバーフローはおこらないのではないかとおもいました。どこが間違っているのか教えてほしいです。

また、スタック領域に記憶するとき記憶された順番があたらしいほどメモリのアドレスがちいさく、順番が古いほどメモリのアドレスは大きいですという考え方(esp<=ebpということ)であっているでしょうか?

初心者で文章が得意ではないのでふかいにさせたらすいません。
回答お願いします。

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

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

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

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

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

guest

回答3

0

気になるのでしたら、 a, b, ab のアドレスがどうなってるか調べましょう。
メモリの配置はコンパイラ(リンカ)依存です。

ただ、確保した以上の領域に書き込んだ時、どうなるかは保証の限りではありません。
PCが壊れても文句は言えません。ご注意を。

あ、小さいほうからhgfedcbaは間違いですね。読み込んだ順番通り。リトル/ビッグは、2byteとか、4byteとかのデータ内でのバイト順。1byteづつ読み込んだ場合と、4byteまとめて読み込んだ場合の配置。

投稿2021/05/14 10:22

pepperleaf

総合スコア6383

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

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

tsuyoku-naritai

2021/05/16 13:10

回答ありがとうございます。 'h' 'g' 'f' 'e' 'd' 'c' 'b' 'a'というように別々に書き込まれた場合はエンディアンは関係せず、"hgfedcba"というように一つのまとまりとして書き込まれた場合はエンディアンが関係するということでしょうか?よろしければ教えてほしいです。
pepperleaf

2021/05/17 00:33

文字列に関するエンディアンは、otnさんが書かれてますね。 1byteずつの書き込みでは、エンディアンは関係ありません。C言語の文字列もbyte単位なので関係無いですね。unionとかで複数バイトをまとめて扱う場合に注意ですが。(慣れないうちはリスク) バッファオーバーフローとエンディアンは直接の関係は無いです。今、一般に使われているCPUでビッグはどれだけあるか? それより、CPUとか、OSの違いが大きいです。メモリをスタックに取らずに、ヒープから取るだけで割り当ては異なります。
tsuyoku-naritai

2021/05/18 03:19

ありがとうございました。わかりました。
guest

0

リトルエンディアンなのでメモリのアドレスは小さいほうからhgfedcbaと記憶されると思っていました。

いいえ。
エンディアンは数値の話です。

どこが間違っているのか教えてほしいです。

abのサイズは10バイトなので、なんであれ10バイト以上入力すればオーバーフローします。
10バイトのエリアには、最後のNULをのぞくと9バイトしか入りません。

同じバイト数なのに、データの中身によってバッファオーバーフローが起こったり起こらなかったりすると思ったと言うことは、どこか基本的なところで勘違いしているのでしょうね。

スタック領域に記憶するとき記憶された順番があたらしいほどメモリのアドレスがちいさく、

合ってます。j

投稿2021/05/14 13:49

otn

総合スコア84557

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

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

tsuyoku-naritai

2021/05/16 13:05

回答ありがとうございます。 おっしゃる通りバッファオーバーフローは10バイト以上入力すればおきます。abcdefghijpasswordと入力すればバッファオーバーフローがおきてかつ printf("改ざんされました\n");が実行されるということでした。少しわからなかったのですが「エンディアンは数値の話です。」とはどうゆうことでしょうか?よろしければおしえてほしいです。
otn

2021/05/16 14:17

> エンディアンは数値の話です。 数値というのは語弊がありました。 別の説明をすると、エンディアンは多バイト長のデータの各バイトをどの順番でメモリに格納するかという話です。 2バイト、4バイト、8バイトとかの整数値をメモリに格納する時に、下位バイトを下位アドレスに入れるか、上位バイトを下位アドレスに入れるかの違いですね。 1バイト整数値だとエンディアンは関係ない。 普通の文字列(US-ASCII、UTF-8、Shit_JISなど)はデータが1バイト単位なので、エンディアンは関係ないです。 UTF-16とかUTF-32だと1つのデータが2バイトとか4バイトなのでエンディアンが関係あります。
tsuyoku-naritai

2021/05/18 03:18

ありがとうございました。理解できました。
guest

0

エンディアンは関係ないです。
とにもかくにも、確保している容量をオーバーしたらダメです。

また、スタック領域に記憶するとき記憶された順番があたらしいほどメモリのアドレスがちいさく

いまのPCでいえば、それであってます

投稿2021/05/14 10:11

y_waiwai

総合スコア87774

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問