質問編集履歴

6

2019/01/22 22:04

投稿

somu
somu

スコア32

test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,4 @@
1
- ret2libc 攻撃を実験してみようと思い、ASLRを無効にして、バッファオーバーフローによりリターンアドレスをsystem()へのアドレスに書き換え、引数を/bin/shにしようとしました。
1
+ ret2libc 攻撃を実験してみようと思い、SSPとASLRを無効にして、バッファオーバーフローによりリターンアドレスをsystem()へのアドレスに書き換え、引数を/bin/shにしようとしました。
2
2
 
3
3
  しかし、system()アドレスが0x0000......だったため引数を指定できませんでした。
4
4
 

5

説明の補足

2019/01/22 22:04

投稿

somu
somu

スコア32

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

4

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

2019/01/22 20:16

投稿

somu
somu

スコア32

test CHANGED
File without changes
test CHANGED
@@ -10,23 +10,33 @@
10
10
 
11
11
  #include <stdio.h>
12
12
 
13
+ #include <string.h>
13
14
 
14
15
 
15
- void foo(int x){
16
16
 
17
- int y;
17
+ void bug(char *arg1){
18
18
 
19
- x++;
19
+ char name[128];
20
20
 
21
- y = 4;
21
+ strcpy(name,arg1);
22
+
23
+ printf("Hello %s\n", name);
22
24
 
23
25
  }
24
26
 
25
27
 
26
28
 
27
- int main(void){
29
+ int main(int argc, char **argv){
28
30
 
31
+ if(argc < 2){
32
+
33
+ printf("Usage: %s <your name>\n", argv[0]);
34
+
29
- foo(2);
35
+ return 0;
36
+
37
+ }
38
+
39
+ bug(argv[1]);
30
40
 
31
41
  return 0;
32
42
 

3

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

2019/01/22 19:02

投稿

somu
somu

スコア32

test CHANGED
File without changes
test CHANGED
File without changes

2

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

2019/01/22 19:00

投稿

somu
somu

スコア32

test CHANGED
File without changes
test CHANGED
@@ -3,3 +3,39 @@
3
3
  しかし、system()アドレスが0x0000......だったため引数を指定できませんでした。
4
4
 
5
5
  実行環境のメモリアドレスは8バイトあるため、全てが0x0000......で表されています。このような場合に、上手くsystem(/bin/sh)を実行する方法を教えて下さい。
6
+
7
+ この実験で使用したコードは以下の通りです。
8
+
9
+ ```C
10
+
11
+ #include <stdio.h>
12
+
13
+
14
+
15
+ void foo(int x){
16
+
17
+ int y;
18
+
19
+ x++;
20
+
21
+ y = 4;
22
+
23
+ }
24
+
25
+
26
+
27
+ int main(void){
28
+
29
+ foo(2);
30
+
31
+ return 0;
32
+
33
+ }
34
+
35
+
36
+
37
+
38
+
39
+ ```
40
+
41
+ ubuntu14.04 64bitで実行しました。

1

2019/01/22 18:59

投稿

somu
somu

スコア32

test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,4 @@
1
- ret2libc 攻撃を実験してみようと思い、ASLRを無効にして、リターンアドレスをsystem()へのアドレスに書き換え、引数を/bin/shにしようとしました。
1
+ ret2libc 攻撃を実験してみようと思い、ASLRを無効にして、バッファオーバーフローによりリターンアドレスをsystem()へのアドレスに書き換え、引数を/bin/shにしようとしました。
2
2
 
3
3
  しかし、system()アドレスが0x0000......だったため引数を指定できませんでした。
4
4