Воспроизведение переполнения буфераLinux

Ответить
Anonymous
 Воспроизведение переполнения буфера

Сообщение Anonymous »

Пытаемся воспроизвести переполнение буфера в Ubuntu 24 в учебных целях.
Итак, цель состоит в том, чтобы вызвать text() второй раз, передав его адрес во входную строку.
$ cat bof.c
#include
#include

void return_input (char *s) {
char array[10];
strcpy(array,s);
printf("%s\n", array);
}

char text () {
printf("Example\n");
}

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

Компиляция для 32-битной системы и отключение защиты стека.
$ gcc -m32 -fno-stack-protector bof.c

Выполнение с правильным/неправильным вводом
$ ./a.out HelloWorld
Example
HelloWorld
$ ./a.out HelloWorld##########
Example
HelloWorld##########
Segmentation fault (core dumped)

Получение дампа
$ coredumpctl list | tail -1
$ coredumpctl dump 15761 > core.15761

Запуск GDB
$ gdb ./a.out core.15761

и
(gdb) disassemble main
Dump of assembler code for function main:
0x59566201 : lea 0x4(%esp),%ecx
0x59566205 : and $0xfffffff0,%esp
0x59566208 : push -0x4(%ecx)
0x5956620b : push %ebp
0x5956620c : mov %esp,%ebp
0x5956620e : push %ebx
0x5956620f : push %ecx
0x59566210 : call 0x59566244
0x59566215 : add $0x2dbf,%eax
0x5956621a : mov %ecx,%ebx
0x5956621c : call 0x595661d6
0x59566221 : mov 0x4(%ebx),%eax
0x59566224 : add $0x4,%eax
0x59566227 : mov (%eax),%eax
0x59566229 : sub $0xc,%esp
0x5956622c : push %eax
0x5956622d : call 0x5956619d
0x59566232 : add $0x10,%esp
0x59566235 : mov $0x0,%eax
0x5956623a : lea -0x8(%ebp),%esp
=> 0x5956623d : pop %ecx
0x5956623e : pop %ebx
0x5956623f : pop %ebp
0x59566240 : lea -0x4(%ecx),%esp
0x59566243 : ret
End of assembler dump.

Теперь, если я правильно понимаю, мне нужно взять адрес для вызова 0x595661d6 , который равен 0x5956621c, и поместить его на вход в обратном порядке, то есть \x1c\x62\x56\x59после некоторого количества символов.
Я пытался позвонить из 1 # символа до 100 # символов, но каждый раз получаю
$ ./a.out #\x1c\x62\x56\x59
Example
Segmentation fault (core dumped)

...

$ ./a.out ####################################################################################################\x1c\x62\x56\x59
Example
Segmentation fault (core dumped)

Example никогда не печатался дважды.
Что я делаю не так? Как на самом деле вызвать text() во второй раз?

Я проверил, обнаружено разрушение стека, но, вероятно, я что-то пропустил.
PS.
$ gcc -v
Using built-in specs.
...
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 13.3.0 (Ubuntu 13.3.0-6ubuntu2~24.04)


Подробнее здесь: https://stackoverflow.com/questions/798 ... r-overflow
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»