Пытаемся воспроизвести переполнение буфера в Ubuntu 24 в учебных целях.
Итак, цель состоит в том, чтобы вызвать call_me_twice второй раз, передав его адрес во входную строку.
$ cat bof.c
#include
#include
void return_input (char *s) {
char array[10];
strcpy(array,s);
printf("%s\n", array);
}
char call_me_twice () {
printf("Example\n");
}
int main (int argc, char *argv[]) {
call_me_twice();
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:
0x66405201 : lea 0x4(%esp),%ecx
0x66405205 : and $0xfffffff0,%esp
0x66405208 : push -0x4(%ecx)
0x6640520b : push %ebp
0x6640520c : mov %esp,%ebp
0x6640520e : push %ebx
0x6640520f : push %ecx
0x66405210 : call 0x66405244
0x66405215 : add $0x2dbf,%eax
0x6640521a : mov %ecx,%ebx
0x6640521c : call 0x664051d6
0x66405221 : mov 0x4(%ebx),%eax
0x66405224 : add $0x4,%eax
0x66405227 : mov (%eax),%eax
0x66405229 : sub $0xc,%esp
0x6640522c : push %eax
0x6640522d : call 0x6640519d
0x66405232 : add $0x10,%esp
0x66405235 : mov $0x0,%eax
0x6640523a : lea -0x8(%ebp),%esp
=> 0x6640523d : pop %ecx
0x6640523e : pop %ebx
0x6640523f : pop %ebp
0x66405240 : lea -0x4(%ecx),%esp
0x66405243 : ret
End of assembler dump.
Теперь, если я правильно понимаю, мне нужно взять адрес для вызова 0x664051d6 , то есть 0x6640521c, и поместить его на вход в обратном порядке, то есть \x1c\x52\x40\x66после некоторого количества символов.
Я попробовал звонить от 1# символа до 100# символов но каждый раз получать
$ ./a.out #\x1c\x52\x40\x66
Example
Segmentation fault (core dumped)
...
$ ./a.out ####################################################################################################\x1c\x52\x40\x66
Example
Segmentation fault (core dumped)
Example никогда не печатался дважды.
Что я делаю не так? Как на самом деле вызвать call_me_twice во второй раз?
Я проверил, обнаружено разрушение стека, но, вероятно, я что-то пропустил.
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
Воспроизведение переполнения буфера ⇐ Linux
1766408552
Anonymous
Пытаемся воспроизвести переполнение буфера в Ubuntu 24 в учебных целях.
[b]Итак, цель состоит в том, чтобы вызвать call_me_twice второй раз, передав его адрес во входную строку.[/b]
$ cat bof.c
#include
#include
void return_input (char *s) {
char array[10];
strcpy(array,s);
printf("%s\n", array);
}
char call_me_twice () {
printf("Example\n");
}
int main (int argc, char *argv[]) {
call_me_twice();
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:
0x66405201 : lea 0x4(%esp),%ecx
0x66405205 : and $0xfffffff0,%esp
0x66405208 : push -0x4(%ecx)
0x6640520b : push %ebp
0x6640520c : mov %esp,%ebp
0x6640520e : push %ebx
0x6640520f : push %ecx
0x66405210 : call 0x66405244
0x66405215 : add $0x2dbf,%eax
0x6640521a : mov %ecx,%ebx
0x6640521c : call 0x664051d6
0x66405221 : mov 0x4(%ebx),%eax
0x66405224 : add $0x4,%eax
0x66405227 : mov (%eax),%eax
0x66405229 : sub $0xc,%esp
0x6640522c : push %eax
0x6640522d : call 0x6640519d
0x66405232 : add $0x10,%esp
0x66405235 : mov $0x0,%eax
0x6640523a : lea -0x8(%ebp),%esp
=> 0x6640523d : pop %ecx
0x6640523e : pop %ebx
0x6640523f : pop %ebp
0x66405240 : lea -0x4(%ecx),%esp
0x66405243 : ret
End of assembler dump.
Теперь, если я правильно понимаю, мне нужно взять адрес для вызова 0x664051d6 , то есть 0x6640521c, и поместить его на вход в обратном порядке, то есть \x1c\x52\x40\x66после [b]некоторого[/b] количества символов.
Я попробовал звонить от 1# символа до 100# символов но каждый раз получать
$ ./a.out #\x1c\x52\x40\x66
Example
Segmentation fault (core dumped)
...
$ ./a.out ####################################################################################################\x1c\x52\x40\x66
Example
Segmentation fault (core dumped)
Example никогда не печатался дважды.
Что я делаю не так? Как на самом деле вызвать call_me_twice во второй раз?
Я проверил, обнаружено разрушение стека, но, вероятно, я что-то пропустил.
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)
Подробнее здесь: [url]https://stackoverflow.com/questions/79851236/reproducing-buffer-overflow[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия