Проблемы с кодировкой во время эксплойта переполнения буфера - PullRequest
1 голос
/ 09 апреля 2020

Я нахожусь на Ubuntu Linux 16.04 / Intel с отключенным ASLR.

Используется следующая программа.

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

void func(char *name)
{
    char buf[100];
    strcpy(buf, name);
    printf("Welcome %s\n", buf);
}

int main(int argc, char *argv[])
{
   func(argv[1]);
   return 0;
}

Она построена с помощью.

$ gcc buf.c -o buf -fno-stack-protector -mpreferred-stack-boundary=2

Я могу успешно переполнить буфер и перезаписать адрес возврата при использовании 7-битных символов (?), Как показано ниже.

gdb-peda$ run $(python3 -c 'print("\x41" * 108)')

enter image description here

Тем не менее, он не работает правильно, когда я пытаюсь вставить 8-битный символ (?).

gdb-peda$ run $(python3 -c 'print("\xc0" * 108)')

enter image description here

Кажется, есть какая-то кодировка UTF-8 в пути, поэтому \xc0 становится \xc3\x80.

Я пытался запустить

gdb-peda$ run $(python3 -c 'print(("\xc0".encode("latin1") * 108))')

Это что-то напутало .. В любом случае, обратный адрес не был успешно перезаписан.

enter image description here

Застрял, и любые указатели будут очень признательны.

1 Ответ

4 голосов
/ 09 апреля 2020

Это потому, что Python по умолчанию кодирует строки sys.stdout.encoding перед записью байтов. Вы можете напрямую записать байты в sys.stdout.buffer, чтобы избежать кодирования:

run $(python3 -c '__import__("sys").stdout.buffer.write(b"\xc0" * 108)')

Когда вы делаете print("\xc0".encode("latin1") * 108) (Эквивалентность просто print(b"\xc0" * 108)), вы печатаете b'\xc0\xc0...\xc0\xc0' (Литеральные байты * 1009). *, ', \, x, ... или 0x62, 0x27, 0x5C, 0x78, ...)

...