Полезные данные из командной строки не перезаписывают стек - PullRequest
1 голос
/ 04 марта 2020

Извините, что это необычно долго, я просто хочу, чтобы участники увидели, что я пробовал, перед публикацией.

Мой код:

     #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: 0x3931785 c 0x6330785 c 03030833083 *

0x603ffed0: 0x603fff00 0xe8e8e8e8 0xe8e8e8e8 0xe8e8e8e8

1019 * 0x603ffee0: 0x60000b9 c 0xe8e8e8e8 0xe8e8e8e8 0xe8e8e8e8 1021 * 0x603ffef0: 0x00000002 0x603fff00 0xe8e8e8e8 0xe8e8e8e8 1023 * Вместо того, чтобы что-то вроде этого: 1025 * 0x603ffeb0: 0x41414141 0x42424242 0x43434343 0x44444444 1027 * 0x603ffec0: 0x60000c19 0x6330785 c 0x3030785 c 0x3036785 c 1031 * 0x603ffed0: 0x603fff00 0xe8e8e8e8 0xe8e8e8e8 0xe8e8e8e8

0x603ffee0: 0x60000b9 c 0xe8e8e8e8 0xe8e8e8e8 0xe8e8e8e8

0x603ffef0: 0x00000002 0x603fff00 0xe8e8e8e8e8e836 Объявление, хранящееся в 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: 0x60000ceeeee0ee0

1050 * 0x603ffed0: 0x60000804 0xe8e8e8e8 0xe8e8e8e8 0xe8e8e8e8 1052 * 0x603ffee0: 0x60000bb8 0xe8e8e8e8 0xe8e8e8e8 0xe8e8e8e8 1054 * 0x603ffef0: 0x00000002 0x603fff00 0xe8e8e8e8 0xe8e8e8e8 1056 * В формате командной строки: (головная боль 0x3931785 c возвращается)
int main(int argc, char** argv){
    gadget1("AAAABBBBCCCCDDDD\\x19\\x0c\\x00\\x60");
    return 0;
}

0x603ffeb0: 0x41414141 0x42424242 0x43434343 0x44444444

0x603ffec0: 0x3931785 *1063* 1063 c 0x3036785 c

0x603ffed0: 0x60000800 0xe8e8e8e8 0xe8e8e8e8 0xe8e8e8e8

0x603ffee0: 0x60000bc4 0xeeeeee e8 0xe8e8e8e8

0x603ffef0: 0x00000002 0x603fff00 0xe8e8e8e8 0xe8e8e8e8

Как предотвратить обработку полезной нагрузки в argv [1] как

* 10BB * 10BB * * * * * x0c \\ x00 \\ x60

?

...