これが非常に長くなって申し訳ありません。投稿する前に、寄稿者に私が試したことを確認してもらいたいだけです.
私のコード:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void nevercalled(){
printf("nevercalled");
}
void gadget1(char payload[]){
char buff[16];
strcpy(buff, payload);
}
int main(int argc, char** argv){
gadget1(argv[1]);
return 0;
}
このコマンドライン引数を渡したとき: AAAABBBBCCCCDDDD\x19\x0c\x00\x60最初の 20 ワードを表示すると、次のようになりました。
0x603ffeb0: 0x41414141 0x42424242 0x43434343 0x44444444
0x603ffec0: 0x3931785c 0x6330785c 0x3030785c 0x3036785c
0x603ffed0: 0x603fff00 0xe8e8e8e8 0xe8e8e8e8 0xe8e8e8e8
0x603ffee0: 0x60000b9c 0xe8e8e8e8 0xe8e8e8e8 0xe8e8e8e8
0x603ffef0: 0x00000002 0x603fff00 0xe8e8e8e8 0xe8e8e8e8
このようなものの代わりに:
0x603ffeb0: 0x41414141 0x42424242 0x43434343 0x44444444
0x603ffec0: 0x60000c19 0x6330785c 0x3030785c 0x3036785c
0x603ffed0: 0x603fff00 0xe8e8e8e8 0xe8e8e8e8 0xe8e8e8e8
0x603ffee0: 0x60000b9c 0xe8e8e8e8 0xe8e8e8e8 0xe8e8e8e8
0x603ffef0: 0x00000002 0x603fff00 0xe8e8e8e8 0xe8e8e8e8
上記のコードでは、配列文字としてではなく、argv[1] に格納されているペイロードが単一の文字列として扱われていることがわかりました。「AAAABBBBCCCCDDDD\\x19\\x0c\\x00\\x60」として表されていることを確認しましたが、これはアドレスを 16 進数に再変換するので役に立ちません。
念のため、これを確認するために直接引数を渡すことにしました (Worked)
int main(int argc, char** argv){
gadget1("AAAABBBBCCCCDDDD\x19\x0c\x00\x60");
return 0;
}
0x603ffeb0: 0x41414141 0x42424242 0x43434343 0x44444444
0x603ffec0: 0x60000c19 0x60000b04 0xe8e8e8e8 0xe8e8e8e8
0x603ffed0: 0x60000804 0xe8e8e8e8 0xe8e8e8e8 0xe8e8e8e8
0x603ffee0: 0x60000bb8 0xe8e8e8e8 0xe8e8e8e8 0xe8e8e8e8
0x603ffef0: 0x00000002 0x603fff00 0xe8e8e8e8 0xe8e8e8e8
コマンドライン形式:(頭の痛い0x3931785cが返されます)
int main(int argc, char** argv){
gadget1("AAAABBBBCCCCDDDD\\x19\\x0c\\x00\\x60");
return 0;
}
0x603ffeb0: 0x41414141 0x42424242 0x43434343 0x44444444
0x603ffec0: 0x3931785c 0x6330785c 0x3030785c 0x3036785c
0x603ffed0: 0x60000800 0xe8e8e8e8 0xe8e8e8e8 0xe8e8e8e8
0x603ffee0: 0x60000bc4 0xe8e8e8e8 0xe8e8e8e8 0xe8e8e8e8
0x603ffef0: 0x00000002 0x603fff00 0xe8e8e8e8 0xe8e8e8e8
argv[1] のペイロードが次のように処理されないようにするにはどうすればよいですか?
- AAAABBBBCCCCDDDD\\x19\\x0c\\x00\\x60
?