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
- 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だけずれていました。
アドレス計算の方法が間違っているんでしょうか?
(追記)
配置されているアドレスと、ベースアドレスは別物なんでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/04/05 06:03
2017/04/05 07:16