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

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

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

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

Q&A

解決済

2回答

1395閲覧

オーバーフロー:アドレスの書き換え

strike1217

総合スコア651

C

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

0グッド

0クリップ

投稿2016/09/10 11:19

以下のプログラムを作ってみました。

.#include<stdio.h>

void printHack(){
printf("成功です!\n");
}

int main(void){
char str[256];
fgets(str,256,stdin);
printf(str);
putchar('\n');
return 0;
}

これをgccでコンパイルしました。
環境はlinuxです。
最適化はしていません。

0x40064c <main+38> lea -0x100(%rbp),%rax
0x400653 <main+45> mov %rax,%rdi
0x400656 <main+48> mov $0x0,%eax
0x40065b <main+53> callq 0x4004e0 printf@plt
0x400660 <main+58> mov $0xa,%edi
0x400665 <main+63> callq 0x4004c0 putchar@plt
0x40066a <main+68> mov $0x0,%eax
0x40066f <main+73> leaveq

0000000000400616 <_Z9printHackv>:
400616: 55 push %rbp
400617: 48 89 e5 mov %rsp,%rbp
40061a: bf 08 07 40 00 mov $0x400708,%edi
40061f: e8 ac fe ff ff callq 4004d0 puts@plt
400624: 5d pop %rbp
400625: c3 retq

GDBと逆アセンブルで以上の結果を得ました。
このことから
printHack() の位置は 0x400616
putchar() の位置は 0x4004c0
でよろしいですよね??
これをputchar()のアドレスをprintHack()のアドレスに書き換えたいのです。

次に echo -e '\xc0\x04\x40%4195859c%6$n' | ./a.out
のようにして実行してみましたが、うまくアドレスの書き換えが成功しません。

\xc0\x04\x40 はputcharのアドレスをリトルエンディアンに、
0x400616を10進数に変換して-3を行っています。

どうすればうまく書き換えられますか?
教えてください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

a.out にパッチを当てる(マシン語レベルで中身を修正することを昔はこう言いました)のであればバイナリエディタが必要です。
参考:普通の Linux 環境で手軽にバイナリファイルを編集する (dd, vim)

gdb でディスアセンブルしたものは、メモリ上に配置されたアドレスで出てるので、a.out の中のオフセット値としてどこを修正すればよいかや、飛び先番地として何に修正すればよいかについては、ELFフォーマットとそれをローダがどう扱うかについて知識が必要です。
参考:古のテクニックを見せようと思ったら最近の技術の前にあっさり敗北した話

投稿2016/09/10 23:07

mit0223

総合スコア3401

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

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

strike1217

2016/09/11 03:45

あ、64bit OSアーキテクチャではこの手法が使えないのでしょうか? NXbitとありましたが・・・ 32bitと64bitでだいぶ異なるんですか??
mit0223

2016/09/11 04:38

テキストセグメントにパッチをあてるのには NXbit は関係ないでしょう。データセグメントにコードを作ってそこを実行しようとすると落ちるようです。64bitでも基本的には同じと思います。
strike1217

2016/09/11 06:47

ほおお・・・ そうなんですか! ありがとうございます。 別の方法を探ってみます。
guest

0

実行可能形式ファイル(windowsでいうところの.exeファイル)の書式に適合したファイルにしないといけないはずです。

投稿2016/09/10 16:01

HogeAnimalLover

総合スコア4830

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

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

strike1217

2016/09/11 08:31

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問