知恵袋のほうでもしたのですが解決できそうにないのでお願いします。
#やりたいこと これまでの過程
echoコマンドを使いパイプを作って文字列をプロンプトへ流したい。
(表現がおかしいかもしれません)
使うソースコード
c
1#pragma warning(disable: 4996) 2#include <intrin.h> 3#include<stdio.h> 4#include <string.h> 5 6int sample(int con); 7int sub(int a); 8 9 10int sample(int con) { 11 int (*func)(int a); 12 func = sub; 13 14 printf("sub関数のアドレス・・・%p\n", *func); 15 void* a = _ReturnAddress(); 16 17 18 19 printf("リターンアドレス・・・%p\n", a); 20 char moji[15]; 21 int* p; 22 p = (int*)moji; 23 int ebpofs; 24 int ebpofs2; 25 int* ebp; 26 ebp = &con; 27 28 unsigned* retaddr = (unsigned*)_AddressOfReturnAddress(); 29 unsigned* pp = retaddr - 1; 30 printf("保存されたebp:%p\n", *pp); 31 32 scanf("%s", moji); 33 printf("%s\n", "ローカル変数"); 34 printf("%s\n", "ローカル変数 4バイト出力 16進数 0 80"); 35 36 for (ebpofs = 0; ebpofs < 80; ebpofs++) { 37 printf("addr:%p price:%x\n", p + ebpofs, p[ebpofs]); 38 } 39 printf("%s\n", "--------------------------------------------"); 40 printf("%s\n", "コマンド引数 4バイト入力 16進数 -5 40"); 41 for (ebpofs2 = -5; ebpofs2 < 40; ebpofs2++) { 42 printf("addr:%p price:%x\n", ebp + ebpofs2, ebp[ebpofs2]); 43 } 44 //リターンアドレス破壊4 45 void* b = _ReturnAddress(); 46 printf("return:%p\n", b); 47 printf("price:%x\n", p[13]); 48 //p[13] = (int)func; 49 //p[13] = ((p[13] >> 6) | (p[13] >> 9)) + 80485; 50 //printf("price:%x\n", p[13]); 51 void* c = _ReturnAddress(); 52 printf("return:%p\n", c); 53 54 unsigned* retaddr2 = (unsigned*)_AddressOfReturnAddress(); 55 unsigned* pp2 = retaddr2 - 1; 56 printf("ebp:%p\n", *pp2); 57 return 0; 58} 59 60int main(int a) { 61 sample(8); 62 return 0; 63} 64 65 66int sub(int a) { 67 printf("%s\n", "破壊成功!"); 68 return 0; 69} 70
バッファオーバーフローを起こしてリターンアドレスを書き換えたいです。
(任意のアドレスに書き換えることは確かにできたが・・・
今回のと話は関係ない)
scanf関数の標準入力からエスケープシーケンスで16進数(アドレス)を指定したかったのですが
エスケープシーケンスはあくまでソースコード上のきまりということで・・・
(入力に¥x61を入れると {'','x','6','1'}となってしまう。)
echoコマンドから文字列を入れることにしました。
(windows標準のコマンドプロンプトではエスケープシーケンスが認識されなかったから
WSLを使用。)
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
cmd
1echo -e "バッファを溢れさせられる文字列" | 上記のソースコード
すると
このようなデバッグエラーが出てきます。
WSLを導入したときはバッファを溢れさせる入力をしても
このような警告?は出なかったのですが、あるときパソコンを再起動したときから
このようなエラーが出てきました。
このエラーの中の「無視」を選択するとそのまま実行できます。
ただ、バッファがあふれる入力が44バイト以上だと「無視」を選択しても
実行できません。
リターンアドレスまでは52バイトあるのでどうしても44バイト以上の入力になってしまいます。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
#やったこと
WSLを再インストールしました。
→結果は変わらず
visual stdio のプロジェクトを変更して実行してみたのですが
→結果は変わらず
プロジェクト>パロディ をいろいろいじってみたのですが
そちらもなにも変わらず。
ネットサーフィンしていても
echoコマンドからバッファを溢れさせたら警告がでるなんていう
事例も発見できず・・・。
何が原因なのかが検討がつかないのですが何かアドバイスをください。
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/08 03:39
2019/10/08 03:52 編集
2019/10/08 03:57
2019/10/08 04:08
2019/10/08 04:19
2019/10/08 04:22
2019/10/08 04:29
2019/10/08 04:36
2019/10/08 04:39
2019/10/08 04:40
2019/10/08 04:41
2019/10/08 04:43
2019/10/08 04:46
2019/10/08 04:47
2019/10/08 04:51
2019/10/08 05:06
2019/10/08 05:14