Невозможно выполнить системную функцию путем изменения регистра EIP

В настоящее время я практикую переполнение буфера и обратный инжиниринг. Мой код содержит неиспользуемую функцию. Я намерен вызвать неиспользуемую функцию, изменив регистр EIP. Но когда я это делаю, программа запускает процесс и завершает работу. Кажется, что функция вызывается, но текстовый файл не был создан, как предполагалось.

Мой код:

#include <stdio.h>
#include <unistd.h>

int helper(){
    system("touch pwn.txt");
}

int overflow() {
    char buffer[500];
    int userinput;
    userinput = read(0, buffer, 700);
    printf("\nUser provided %d bytes. Buffer content is: %s\n", userinput, buffer);
    return 0;
}

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

Я получил адрес «вспомогательной» функции, как показано ниже, с помощью gdb.

Адрес вспомогательной функции (изображение)

Я перевернул его, чтобы отправить в буфер, как показано.

Перевернутый текст для вызова вспомогательной функции (изображение)

При запуске Программа запускает процесс и завершает работу. Текстовый файл не создается, как предполагалось.

Программа запускает процесс и завершает работу (изображение)

Как исправить, ребята?

Примечание. Я нашел смещение для изменения регистра EIP с помощью модуля шаблона в инструментах peda.

Инструменты шаблонов в педа (изображение)

EXE-файл был создан как 32-битный исполняемый файл в 64-битной ОС с использованием флага -m32 с компилятором gcc.

OS : PRETTY_NAME="Kali GNU/Linux Rolling"
     NAME="Kali GNU/Linux"
     ID=kali
     VERSION="2020.2"
     VERSION_ID="2020.2"
     VERSION_CODENAME="kali-rolling"
     ID_LIKE=debian

GCC : gcc version 9.3.0 (Debian 9.3.0-10)

person gopi    schedule 29.04.2020    source источник


Ответы (1)


Я получил адрес «вспомогательной» функции, как показано ниже, с помощью gdb.

Полученный вами адрес: 0x565561b9 означает, что вы скомпилировали независимый от позиции исполняемый файл, который загружается каждый раз по другому адресу (за исключением GDB, поскольку GDB отключает рандомизацию адресов).

В качестве первого шага вы должны пересобрать свой исполняемый файл с флагами -fno-pie -no-pie и запустить его с отключенным ASLR (точно так же, как он работает в GDB):

setarch `uname -m` -R /root/vulnerable

Как только вы это заработаете, вам нужно выяснить, как заставить его работать с включенным ASLR (ASLR предназначен для того, чтобы усложнить именно эту атаку).

person Employed Russian    schedule 29.04.2020