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

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

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

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

セキュリティー

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

Q&A

解決済

2回答

6178閲覧

objdumpでメモリ配置まで見たい

konataro

総合スコア37

C

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

セキュリティー

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

0グッド

2クリップ

投稿2019/05/04 23:08

編集2019/05/05 06:08

下記のコードをコンパイルし、objdumpで実際に配置されるメモリのアドレスを確認することはできないでしょうか。

C

1//bof3.c 2#include <stdio.h> 3#include <string.h> 4#include <stdlib.h> 5int main(int argc, char **argv) { 6 char buffer[256]; 7 if(argc != 2) { 8 exit(0); 9 } 10 printf("%p\n", buffer); 11 strcpy(buffer, argv[1]); 12 printf("%s\n", buffer); 13 return 0; 14} 15

 
コマンド

gcc -m64 bof3.1.c -o bof3.1 -fno-stack-protector -z execstack objdump -d -M intel -j .plt --no bof3.1

 
objdump結果

bof3.1: file format elf64-x86-64 Disassembly of section .plt: 0000000000001020 <.plt>: 1020: push QWORD PTR [rip+0x2fe2] # 4008 <_GLOBAL_OFFSET_TABLE_+0x8> 1026: jmp QWORD PTR [rip+0x2fe4] # 4010 <_GLOBAL_OFFSET_TABLE_+0x10> 102c: nop DWORD PTR [rax+0x0] 0000000000001030 <strcpy@plt>: 1030: jmp QWORD PTR [rip+0x2fe2] # 4018 <strcpy@GLIBC_2.2.5> 1036: push 0x0 103b: jmp 1020 <.plt> 0000000000001040 <puts@plt>: 1040: jmp QWORD PTR [rip+0x2fda] # 4020 <puts@GLIBC_2.2.5> 1046: push 0x1 104b: jmp 1020 <.plt> 0000000000001050 <printf@plt>: 1050: jmp QWORD PTR [rip+0x2fd2] # 4028 <printf@GLIBC_2.2.5> 1056: push 0x2 105b: jmp 1020 <.plt> 0000000000001060 <exit@plt>: 1060: jmp QWORD PTR [rip+0x2fca] # 4030 <exit@GLIBC_2.2.5> 1066: push 0x3 106b: jmp 1020 <.plt>

---追記---

私が読んでいる本では以下のようにobjdumpのみで、実行後に配置されるようなメモリの値がでているようです。。これはelf32だからなのでしょうか。。。
objdump使用例

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

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

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

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

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

cateye

2019/05/05 01:38

メモリアドレスは、実際にロードされるまで分からないと思いますが?
guest

回答2

0

ベストアンサー

PIC(position independent code)ではなくアドレスをリンク時に決めて実行可能ファイルを作成したとき、どういうアドレスになるかを調べたいということだと思います。
普段PICかどうかとかロードアドレスとかを気にすることがないので「どうなんだろう」と思い

「gcc plt section」

でググると

ELF実行ファイルのメモリ配置はどのように決まるのか

という記事を見つけました。あまり深く読んではいないですが質問者さんが使っておられるコンパイルオプションを用いてUbuntu上にてgccでコンパイル・リンクして記事の通りにやってみたところ

・gdbを用いてmainで停止させプロセスのメモリーマップを/proc/プロセスid/mapsで表示
・readelf -Sでexecutableの各セクションの配置アドレスを表示

といったことができるみたいでした。この記事あたりが参考になるのではないでしょうか?

投稿2019/05/05 02:42

編集2019/05/05 02:43
KSwordOfHaste

総合スコア18392

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

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

konataro

2019/05/05 06:06

回答ありがとうございます!! 言葉足らずで申し訳ないです。 ちなみに、本だと実行していないのにobjdumpで.pltセクションのメモリ配置を確認しているようでした。。。これも実際に配置させてからobjdumpで見ているのでしょうか?
guest

0

偶然、teratail内で発見しました....ハリネズミ本で困った人のために。

PIE(position-independent executable)と呼ばれるセキュリティ機能がobjdumpで逆アセンブリしたときに相対アドレスが表示されてしまう原因だったようです。
解決方法↓
バッファオーバーフローを起こしたい。

投稿2019/08/12 13:42

編集2019/08/12 13:43
konataro

総合スコア37

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問