回答編集履歴
1
訂正
answer
CHANGED
@@ -8,4 +8,114 @@
|
|
8
8
|
// 省略
|
9
9
|
```
|
10
10
|
|
11
|
-
で関数ごとにセキュリティチェックを無効化できるようです。
|
11
|
+
で関数ごとにセキュリティチェックを無効化できるようです。
|
12
|
+
|
13
|
+
-----
|
14
|
+
|
15
|
+
**追記**
|
16
|
+
以下で攻撃文字列の生成・読み込みに成功
|
17
|
+
|
18
|
+
`demo.exe /dump 28` => `dump.bin`に攻撃文字列を生成
|
19
|
+
`type dump.bin | demo.exe` => `dump.bin`をwindowsの標準コマンド`type`で読み込み`demo.exe`にわたす
|
20
|
+
`demo.exe /echo 28 | demo.exe`
|
21
|
+
|
22
|
+
プロジェクトのプロパティ
|
23
|
+
- C/C++>コード生成>基本ランタイムチェック: 既定
|
24
|
+
- C/C++>コード生成>セキュリティチェック: セキュリティチェックを無効にします
|
25
|
+
- リンカー>詳細設定>ランダム化されたベースアドレス: いいえ
|
26
|
+
|
27
|
+
```c++
|
28
|
+
#pragma warning(disable: 4996)
|
29
|
+
#include <intrin.h>
|
30
|
+
#include <stdio.h>
|
31
|
+
#include <stdlib.h>
|
32
|
+
#include <string.h>
|
33
|
+
|
34
|
+
int sample(int con);
|
35
|
+
int sub(int a);
|
36
|
+
|
37
|
+
|
38
|
+
int sample(int con) {
|
39
|
+
int(*func)(int a);
|
40
|
+
func = sub;
|
41
|
+
|
42
|
+
printf("sub関数のアドレス・・・%p\n", *func);
|
43
|
+
void* a = _ReturnAddress();
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
printf("リターンアドレス・・・%p\n", a);
|
48
|
+
char moji[15];
|
49
|
+
int* p;
|
50
|
+
p = (int*)moji;
|
51
|
+
int ebpofs;
|
52
|
+
int ebpofs2;
|
53
|
+
int* ebp;
|
54
|
+
ebp = &con;
|
55
|
+
|
56
|
+
unsigned* retaddr = (unsigned*)_AddressOfReturnAddress();
|
57
|
+
unsigned* pp = retaddr - 1;
|
58
|
+
printf("書き換えたいアドレス: %p + %u\n", moji, (uintptr_t)retaddr - (uintptr_t)moji);
|
59
|
+
printf("保存されたebp:%p\n", *pp);
|
60
|
+
|
61
|
+
scanf("%s", moji);
|
62
|
+
puts("ローカル変数");
|
63
|
+
puts("ローカル変数 4バイト出力 16進数 0 80");
|
64
|
+
|
65
|
+
for (ebpofs = 0; ebpofs < 80; ebpofs++) {
|
66
|
+
printf("addr:%p price:%x\n", p + ebpofs, p[ebpofs]);
|
67
|
+
}
|
68
|
+
puts("--------------------------------------------");
|
69
|
+
puts("コマンド引数 4バイト入力 16進数 -5 40");
|
70
|
+
for (ebpofs2 = -5; ebpofs2 < 40; ebpofs2++) {
|
71
|
+
printf("addr:%p price:%x\n", ebp + ebpofs2, ebp[ebpofs2]);
|
72
|
+
}
|
73
|
+
//リターンアドレス破壊4
|
74
|
+
void* b = _ReturnAddress();
|
75
|
+
printf("return:%p\n", b);
|
76
|
+
printf("price:%x\n", p[13]);
|
77
|
+
//p[13] = (int)func;
|
78
|
+
//p[13] = ((p[13] >> 6) | (p[13] >> 9)) + 80485;
|
79
|
+
//printf("price:%x\n", p[13]);
|
80
|
+
void* c = _ReturnAddress();
|
81
|
+
printf("return:%p\n", c);
|
82
|
+
|
83
|
+
unsigned* retaddr2 = (unsigned*)_AddressOfReturnAddress();
|
84
|
+
unsigned* pp2 = retaddr2 - 1;
|
85
|
+
printf("ebp:%p\n", *pp2);
|
86
|
+
return 0;
|
87
|
+
}
|
88
|
+
|
89
|
+
void dump(int argc, char** argv, FILE* fp) {
|
90
|
+
int offset = 0;
|
91
|
+
if (argc > 2)
|
92
|
+
offset = atoi(argv[2]);
|
93
|
+
for (int i = 0; i < offset; i++)
|
94
|
+
fputc('x', fp);
|
95
|
+
void* addr = sub;
|
96
|
+
fwrite(&addr, sizeof(addr), 1, fp);
|
97
|
+
}
|
98
|
+
|
99
|
+
int main(int argc, char** argv) {
|
100
|
+
if (argc > 1) {
|
101
|
+
if (!strcmp(argv[1], "/dump")) {
|
102
|
+
FILE* fp = fopen("dump.bin", "wb");
|
103
|
+
dump(argc, argv, fp);
|
104
|
+
fclose(fp);
|
105
|
+
return 0;
|
106
|
+
}
|
107
|
+
else if (!strcmp(argv[1], "/echo")) {
|
108
|
+
dump(argc, argv, stdout);
|
109
|
+
return 0;
|
110
|
+
}
|
111
|
+
}
|
112
|
+
sample(8);
|
113
|
+
return 0;
|
114
|
+
}
|
115
|
+
|
116
|
+
|
117
|
+
int sub(int a) {
|
118
|
+
puts("破壊成功!");
|
119
|
+
return 0;
|
120
|
+
}
|
121
|
+
```
|