Тест переполнения буфера в Fedora 32-битный без изменения значения регистра $ eip - PullRequest
0 голосов
/ 21 апреля 2019

Я пытаюсь выполнить простое переполнение буфера на 32-битной Fedora, но значение регистра eip не меняется

Мой код C выглядит следующим образом:

#include <string.h>
int main(int argc, char ** argv){
    char buffer[8];
    strcpy(buffer, argv[1]);
}

У меня естьпопытался выполнить:

echo 0 > /proc/sys/kernel/exec-shield
echo 0 > /proc/sys/kernel/randomize_va_space

, чтобы отключить любую защиту.Также как я скомпилировал это так:

gcc -g -Wall -fno-stack-protector -z execstack -m32 boftest.c -o boftest

Когда я запускаю команду

./boftest AAAABBBBCCCCDDDD

А затем наблюдаю значения регистра с помощью gdb;Я вижу, что:

ebp contains  0x44444444, but 
eip contains 0x80483F4

, что означает, что $ eip не был успешно изменен.

Я читал другие вопросы с той же проблемой, но ни одно из решений не помогло мне.Не могли бы вы понять, как это сделать?

Ответы [ 2 ]

0 голосов
/ 23 апреля 2019

Хорошо, я думаю, что со временем понял, что происходит.Я пытался проверить переполнение буфера в Linux на Fedore 9. Я перепробовал все модификации, но ничего не получилось.

Поэтому я сменил ОС на Ubuntu 12.04, и тест сработал отлично.При выполнении ./boftest `perl -e 'print "A" x 200'` значение регистра $eip было перезаписано на 0x41414141, где 0x41 - шестнадцатеричное значение символа 'A', что означает, что тест переполнения буфера сработал.

Я думаю, чтопроблема была в операционной системе Fedora, возможно, она предлагала другие уровни защиты от переполнения буфера, о которых я не знал, в то время как версия ubuntu 12.04 не знала.Мне нужна была только команда echo 0 > /proc/sys/kernel/randomize_va_space, чтобы тест работал.

0 голосов
/ 22 апреля 2019

Одним из возможных результатов является то, что копия перезаписывает стек всего, что было в стеке, до того, как был вызван main. Вы проверяете регистры. Вместо этого проверьте стек, откуда указывает EPB.

EIP - это реестр указателей инструкций, поэтому я не понимаю, почему вы думаете, что это изменится каким-то интересным образом. Обратите внимание, что машинные инструкции не находятся в стеке в x86. Также нет никакой гарантии, что адрес возврата находится в стеке, поэтому вы не обязательно измените его с помощью записи переполнения, если вы этого хотите.

Если вы хотите изменить EIP, вам нужно изменить указатель какой-либо функции или что-то еще. Добавьте указатель функции по буферу, а затем вызовите его в конце main и посмотрите, измените ли вы EIP, переполнив запись над указателем функции.

...