質問編集履歴
6
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
説明の補足
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
先の編集で貼り付けるコードを間違えていたので、修正しました。
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
|
-
|
17
|
+
void bug(char *arg1){
|
18
18
|
|
19
|
-
|
19
|
+
char name[128];
|
20
20
|
|
21
|
-
y
|
21
|
+
strcpy(name,arg1);
|
22
|
+
|
23
|
+
printf("Hello %s\n", name);
|
22
24
|
|
23
25
|
}
|
24
26
|
|
25
27
|
|
26
28
|
|
27
|
-
int main(v
|
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
|
-
|
35
|
+
return 0;
|
36
|
+
|
37
|
+
}
|
38
|
+
|
39
|
+
bug(argv[1]);
|
30
40
|
|
31
41
|
return 0;
|
32
42
|
|
3
先の編集に伴ってタグを追加しました。
test
CHANGED
File without changes
|
test
CHANGED
File without changes
|
2
質問を補足するためソースコードを追加しました。
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
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
|
|