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

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

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

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

C

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

1回答

4983閲覧

gdbで見るlibcのアドレスと、lddコマンド+nmコマンドを使って計算したlibcのアドレスが違う

akamakku

総合スコア191

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

C

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

2グッド

0クリップ

投稿2017/03/24 06:48

編集2017/03/24 07:04

ret2libcを再現してみようとしています。
※ASLRは無効になっています。

<前提>(セキュリティコンテストチャレンジブックを参考にしています)

C

1//bof.c 2#include <stdio.h> 3#include <string.h> 4 5char buffer[32]; 6 7int main(int argc, char const *argv[]) 8{ 9 char local[32]; 10 printf("buffer : 0x%x\n", &buffer); 11 fgets(local, 128, stdin); 12 strcpy(buffer, local); 13 return 0; 14}

bash

1$gcc -m32 -fno-stack-protector -o bof bof.c
  1. gdbを用いて、system関数のアドレスを調べる。

bash

1#出力を省略しています 2$gdb -q bof 3>b main 4>r 5>p system 6$1 = {<text variable, no debug info>} 0xf7e53e10 <system>

gdbを用いてsystem関数のアドレスを調べた結果、0xf7e53e10でした。

2. ldd + nm を用いて、system関数のアドレスを計算する。

bash

1$ldd bof 2 linux-gate.so.1 => (0xf7ffd000) 3 libc.so.6 => /lib/libc.so.6 (0xf7e37000) 4 /lib/ld-linux.so.2 (0x56555000) 5$ldd bof 6 linux-gate.so.1 => (0xf7ffd000) 7 libc.so.6 => /lib/libc.so.6 (0xf7e37000) 8 /lib/ld-linux.so.2 (0x56555000)

ASLRは無効になっており、libc.so.6は、0xf7e37000に配置されている。

bash

1$nm _D /lib/libc.so.6 | grep system 20003de10 T __libc_system 300127970 T svcerr_systemerr 40003de10 W system

libc内では、system関数は0x3de10に配置されている。

bash

1$ python -c 'print(hex(0xf7e37000+0x0003de10))' 20xf7e74e10

よって、メモリ上のsystem関数のアドレスは、0xf7e74e10

このように求まったアドレスが異なっています。

この2つのアドレスをそれぞれ使って、ret2libcをしてみたところ、
1.のアドレスはうまくいきましたが、2.のアドレスでは「Illegal instruction」と表示されうまくいきませんでした。

上記のコードでは、2つのアドレスが,0x21000だけずれていますが、
ちょっとコードを変えてやってみたのも、0x21000だけずれていました。

アドレス計算の方法が間違っているんでしょうか?

(追記)
配置されているアドレスと、ベースアドレスは別物なんでしょうか?

wp-h, SST8897👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

Ubuntu16.04 64ビット環境ですが、ldd <実行ファイル>ではなく、LD_TRACE_LOADED_OBJECTS=1 <実行ファイル>とやって、表示されたアドレスだと、計算が合いました。


gdbからでてきたアドレス (gdb) $1 = {<text variable, no debug info>} 0x7ffff7a53390 <__libc_system>と、$ADDR_LIBC + $OFFSET_SYSTEM => 0x7ffff7a53390からのアドレスが一致。

  • 確認例
mt08@u1604:~/teratail.com/questions/70098$ uname -a Linux u1604 4.4.0-71-generic #92-Ubuntu SMP Fri Mar 24 12:59:01 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux mt08@u1604:~/teratail.com/questions/70098$ cat /etc/issue Ubuntu 16.04.2 LTS \n \l mt08@u1604:~/teratail.com/questions/70098$ # ASLRを無効にする mt08@u1604:~/teratail.com/questions/70098$ echo 0 | sudo tee /proc/sys/kernel/randomize_va_space 0 mt08@u1604:~/teratail.com/questions/70098$ ls -l total 8 -rw-rw-r-- 1 mt08 mt08 240 Mar 31 07:55 bof.c -rw-rw-r-- 1 mt08 mt08 22 Mar 31 07:58 gdb_cmd.txt mt08@u1604:~/teratail.com/questions/70098$ cat bof.c //bof.c #include <stdio.h> #include <string.h> char buffer[32]; int main(int argc, char const *argv[]) { char local[32]; printf("buffer : 0x%p\n", &buffer); fgets(local, 128, stdin); strcpy(buffer, local); return 0; } mt08@u1604:~/teratail.com/questions/70098$ cat gdb_cmd.txt b main r p system q y mt08@u1604:~/teratail.com/questions/70098$ gcc -fno-stack-protector -o bof bof.c -g mt08@u1604:~/teratail.com/questions/70098$ gdb -q ./bof < gdb_cmd.txt Reading symbols from ./bof...done. (gdb) Breakpoint 1 at 0x400605: file bof.c, line 10. (gdb) Starting program: /home/mt08/teratail.com/questions/70098/bof Breakpoint 1, main (argc=1, argv=0x7fffffffe408) at bof.c:10 10 printf("buffer : 0x%p\n", &buffer); (gdb) $1 = {<text variable, no debug info>} 0x7ffff7a53390 <__libc_system> (gdb) A debugging session is active. Inferior 1 [process 18406] will be killed. Quit anyway? (y or n) [answered Y; input not from terminal] mt08@u1604:~/teratail.com/questions/70098$ LD_TRACE_LOADED_OBJECTS=1 ./bof linux-vdso.so.1 => (0x00007ffff7ffa000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffff7a0e000) /lib64/ld-linux-x86-64.so.2 (0x00007ffff7dd7000) mt08@u1604:~/teratail.com/questions/70098$ nm -D /lib/x86_64-linux-gnu/libc.so.6 | grep ' system$' 0000000000045390 W system mt08@u1604:~/teratail.com/questions/70098$ ADDR_LIBC=`LD_TRACE_LOADED_OBJECTS=1 ./bof | grep libc | perl -e '$str=<STDIN>; $str=~/\((.+)\)/;printf("%s\n",$1)'` mt08@u1604:~/teratail.com/questions/70098$ OFFSET_SYSTEM=`nm -D /lib/x86_64-linux-gnu/libc.so.6 | grep ' system$' | perl -e '$str=<STDIN>;$str=~/^(.+) (.) /;printf("0x%s\n",$1)'` mt08@u1604:~/teratail.com/questions/70098$ echo printf\(\"0x%x\\n\", $ADDR_LIBC + $OFFSET_SYSTEM\) printf("0x%x\n", 0x00007ffff7a0e000 + 0x0000000000045390) mt08@u1604:~/teratail.com/questions/70098$ echo printf\(\"0x%x\\n\", $ADDR_LIBC + $OFFSET_SYSTEM\) | perl 0x7ffff7a53390 mt08@u1604:~/teratail.com/questions/70098$

投稿2017/03/30 23:48

mt08

総合スコア1825

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

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

akamakku

2017/04/05 06:03

回答ありがとうございます。 Man page of LDD には"ldd は標準の動的リンカー (ld.so(8) 参照) を LD_TRACE_LOADED_OBJECTS 環境変数に 1 をセットして起動する。 "と書いてあるのですが、 lddとLD_TRACE_LOADED_OBJECTS=1はなにが違うんでしょうか?
mt08

2017/04/05 07:16

Teppayさん、 `ldd`は、shell scriptなので、中身をみて、追ってみるといいかと思います。 ``` mt08@linux64:~/teratail.com/questions/70098$ file `which ldd` /usr/bin/ldd: Bourne-Again shell script, ASCII text executable ``` ちなみに、`echo` とかつっこんで、確認したところ、こちらの環境では、 `LD_TRACE_LOADED_OBJECTS=1 LD_WARN= LD_BIND_NOW= LD_LIBRARY_VERSION=$verify_out LD_VERBOSE= /lib64/ld-linux-x86-64.so.2 ./bof` という感じで、呼ばれてました。 `/lib64/ld-linux-x86-64.so.2` がつくか、つかないかで、変わるみたいですね. ``` mt08@linux64:~/teratail.com/questions/70098$ LD_TRACE_LOADED_OBJECTS=1 /lib64/ld-linux-x86-64.so.2 ./bof linux-vdso.so.1 => (0x00007ffff7ffd000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffff7c19000) /lib64/ld-linux-x86-64.so.2 (0x0000555555554000) mt08@linux64:~/teratail.com/questions/70098$ ldd ./bof linux-vdso.so.1 => (0x00007ffff7ffd000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffff7c19000) /lib64/ld-linux-x86-64.so.2 (0x0000555555554000) mt08@linux64:~/teratail.com/questions/70098$ LD_TRACE_LOADED_OBJECTS=1 ./bof linux-vdso.so.1 => (0x00007ffff7ffa000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffff7a0e000) /lib64/ld-linux-x86-64.so.2 (0x00007ffff7dd7000) ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問