teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

6

2019/01/22 22:04

投稿

somu
somu

スコア32

title CHANGED
File without changes
body CHANGED
@@ -1,4 +1,4 @@
1
- ret2libc 攻撃を実験してみようと思い、ASLRを無効にして、バッファオーバーフローによりリターンアドレスをsystem()へのアドレスに書き換え、引数を/bin/shにしようとしました。
1
+ ret2libc 攻撃を実験してみようと思い、SSPとASLRを無効にして、バッファオーバーフローによりリターンアドレスをsystem()へのアドレスに書き換え、引数を/bin/shにしようとしました。
2
2
  しかし、system()アドレスが0x0000......だったため引数を指定できませんでした。
3
3
  実行環境のメモリアドレスは8バイトあるため、全てが0x0000......で表されています。このような場合に、上手くsystem(/bin/sh)を実行する方法を教えて下さい。
4
4
 

5

説明の補足

2019/01/22 22:04

投稿

somu
somu

スコア32

title CHANGED
File without changes
body CHANGED
@@ -1,6 +1,14 @@
1
1
  ret2libc 攻撃を実験してみようと思い、ASLRを無効にして、バッファオーバーフローによりリターンアドレスをsystem()へのアドレスに書き換え、引数を/bin/shにしようとしました。
2
2
  しかし、system()アドレスが0x0000......だったため引数を指定できませんでした。
3
3
  実行環境のメモリアドレスは8バイトあるため、全てが0x0000......で表されています。このような場合に、上手くsystem(/bin/sh)を実行する方法を教えて下さい。
4
+
5
+ 補足
6
+ このプログラムを、gdbにおいて、
7
+ r `perl -e 'print "A"x128,"B"x8,"(system関数のアドレス)","(exit関数のアドレス)",
8
+ "(環境変数を用いた 文字列/bin/sh へのアドレス)"'`
9
+ で実行した所、system関数のアドレスが \x--\x.......\x00\x00となってしまうため、strcpyが文字列として認識するのが入力値のsystem関数のアドレスの6バイト目までとなってしまい、system関数の引数部分を書き換えられない、という意味です。うまく伝わればいいのですが・・・
10
+ また、この実験はCTFに参加してみたく行ったものなので、悪意ある攻撃のためではありません。
11
+
4
12
  この実験で使用したコードは以下の通りです。
5
13
  ```C
6
14
  #include <stdio.h>

4

先の編集で貼り付けるコードを間違えていたので、修正しました。

2019/01/22 20:16

投稿

somu
somu

スコア32

title CHANGED
File without changes
body CHANGED
@@ -4,15 +4,20 @@
4
4
  この実験で使用したコードは以下の通りです。
5
5
  ```C
6
6
  #include <stdio.h>
7
+ #include <string.h>
7
8
 
8
- void foo(int x){
9
+ void bug(char *arg1){
9
- int y;
10
+ char name[128];
10
- x++;
11
- y = 4;
11
+ strcpy(name,arg1);
12
+ printf("Hello %s\n", name);
12
13
  }
13
14
 
15
+ int main(int argc, char **argv){
14
- int main(void){
16
+ if(argc < 2){
17
+ printf("Usage: %s <your name>\n", argv[0]);
15
- foo(2);
18
+ return 0;
19
+ }
20
+ bug(argv[1]);
16
21
  return 0;
17
22
  }
18
23
 

3

先の編集に伴ってタグを追加しました。

2019/01/22 19:02

投稿

somu
somu

スコア32

title CHANGED
File without changes
body CHANGED
File without changes

2

質問を補足するためソースコードを追加しました。

2019/01/22 19:00

投稿

somu
somu

スコア32

title CHANGED
File without changes
body CHANGED
@@ -1,3 +1,21 @@
1
1
  ret2libc 攻撃を実験してみようと思い、ASLRを無効にして、バッファオーバーフローによりリターンアドレスをsystem()へのアドレスに書き換え、引数を/bin/shにしようとしました。
2
2
  しかし、system()アドレスが0x0000......だったため引数を指定できませんでした。
3
- 実行環境のメモリアドレスは8バイトあるため、全てが0x0000......で表されています。このような場合に、上手くsystem(/bin/sh)を実行する方法を教えて下さい。
3
+ 実行環境のメモリアドレスは8バイトあるため、全てが0x0000......で表されています。このような場合に、上手くsystem(/bin/sh)を実行する方法を教えて下さい。
4
+ この実験で使用したコードは以下の通りです。
5
+ ```C
6
+ #include <stdio.h>
7
+
8
+ void foo(int x){
9
+ int y;
10
+ x++;
11
+ y = 4;
12
+ }
13
+
14
+ int main(void){
15
+ foo(2);
16
+ return 0;
17
+ }
18
+
19
+
20
+ ```
21
+ ubuntu14.04 64bitで実行しました。

1

2019/01/22 18:59

投稿

somu
somu

スコア32

title CHANGED
File without changes
body CHANGED
@@ -1,3 +1,3 @@
1
- ret2libc 攻撃を実験してみようと思い、ASLRを無効にして、リターンアドレスをsystem()へのアドレスに書き換え、引数を/bin/shにしようとしました。
1
+ ret2libc 攻撃を実験してみようと思い、ASLRを無効にして、バッファオーバーフローによりリターンアドレスをsystem()へのアドレスに書き換え、引数を/bin/shにしようとしました。
2
2
  しかし、system()アドレスが0x0000......だったため引数を指定できませんでした。
3
3
  実行環境のメモリアドレスは8バイトあるため、全てが0x0000......で表されています。このような場合に、上手くsystem(/bin/sh)を実行する方法を教えて下さい。