![]() |
проблема с экплойтом
пишу эксплойт , вызывающий переполнение буфера, программа читает буфер и устанавливает eip = ss:[len+6] ; тут то и проблема если я задаю адрес 0x2122f5f5 то он записывает в eip(но это не правильный адрес), если я записываю 0x0022f5f5 то он почему то не учитывает 0х00 а вместо него берет 0x2c. почему?
|
всмысле не учитывает? ты смотри на память. Что кидаеш в буфер и что попадает в стек. Возможно на какомто этапе перезатирается значение (такое часто бывает когда функция юзает локальные переменные).
|
Цитата:
уже голову сломал ап стену!!!!!!!!!!!!!!!!!! :mad: причем странно если я пишу адрес возврата 0x0022f55f то eip становится 2C22F55A если 0xyy22f55f то yy22F55A |
скорее всего тогда просто идет работа со стеком, где эти данные и изменяются
ты сделать проверку чтобы был адрес eip 1) 00 00 00 00 - увидиш что меняется 2) FF FF FF FF - аналогично предыдущему, но чуть по другому 3) 60 70 80 90 / 90 80 70 60- если вдруг чтото конвертится. т.е. бывает случае когда конвертятся некоторые символы алфавита. Чтото типа UTF8 кодировки тут ты и провериш на какие символы влияет это. если вообще дело в этом |
Цитата:
2) FF FF FF FF получаю FF FF FF FF 3) 60 70 80 90 / 90 80 70 60 получаю 60 70 80 90 / 90 80 70 60 ему однозначно не нравится 0 байт)) |
судя по всему дело обстоит так:
Уязвимая функция определяет длину строки и в конце неё дописывает другие данные. В твоем случае часть этого текста - "in ," p.s. а зачем тебе именно настолько нижние адреса? |
Цитата:
я с начало вшил шеллкод в буфер(он 0..1024) программа обращается к [1030] за адресом. но т.к. у меня в шеллкоде содержатся \х00 то из-за них не возникало ошибки. я взял по адресу [1030] разместил адрес на [1031] куда и положил шеллкод. адрес я беру из olly'ки смотрю где расположен шеллкод и на него ссылаюсь . вот код int handling(SOCKET c) { char buffer[BUFFER_SIZE], name[NAME_SIZE]; int bytes; strcpy(buffer, "My name is: "); bytes = send(c, buffer, strlen(buffer), 0); if (bytes == -1)return -1; bytes = recv(c, name, sizeof(name), 0); if (bytes == -1)return -1; name[bytes - 1] = '\0'; sprintf(buffer, "Hello %s, nice to meet you!\r\n\0", name); bytes = send(c, buffer, strlen(buffer), 0); if (bytes == -1)return -1; return 0; } p.s. я только начинаю разбираться в этом. статьи которые читал(их не так много) с ошибками идут. |
sprintf(buffer, "Hello %s, nice to meet you!\r\n\0", name);
ну вот собственно говоря где оно и затирается ) алгоритм работы такой: 1) в буфер запишется строка "Hello " 2) к нему прибавится всё что есть в name до первого 0x00 3) к полученному тексту прибавятся данные ", nice to meet you!\r\n\0" вот теперь из последней строки возьми 4 байта и разверни их наоборот ", ni" = "in ," и ты получаешь то, о чем я говорил. что они затираются. так что в полюбому затрутся данные начиная с 0x00 по этому придется както ухитрится и не юзать 0 |
Цитата:
а можешь подкинуть ссылки где решается эта проблема? |
это вообще возможно?!??!?!?!
я представляю как можно избавить сам шеллкод от нулей, но как адрес?!?! ведь мы же не можем ничего с ним сделать, и он должен указывать на наш код. |
| Время: 04:25 |