|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Июн 25, 2003 11:51:58 Пишу эксплоит (классическое переполнение буфера). Проблема: все байты должны удовлетворять не только стандартному условию – отсутствию нулевых байт, но и еще одному – все они должны быть ascii символами из диапазона 0x21 – 0x7e. Как бы это сделать – как я не пробую (думал, что можно написать декодер в начале кода, который декодирует оставшиеся байты, но сам декодер не выходит в "нужных" байтах), ничего не выходит. |
|
|
Дата: Июн 25, 2003 14:16:19 у докторвеба есть вместе с досовской версией программа написанная только на ascii символах test.com |
|
|
Дата: Июн 25, 2003 18:28:09 По моему имеющихся байт должно хватить чтобы написать декодер, проблемы могут быть только с передачей ему управления. Или ты эту задачу уже решил? |
|
|
Дата: Июн 25, 2003 18:41:05 Да, управление уже передал. Вот что имеем: требуется запустить командный процессор, указав ему параметр, что делать. Скажем, так: cmd.exe del C:\boot.ini. Для этого вполне подойдет WinExec(). Значится, сам код я написал, он примерно такой (пишу на скорую руку): call $+5 pop eax -- В EAX содержимое EIP, т.е. начала нашего кода add eax, 17 -- укажем на начало строки cmd... push 1 push eax call 7789122 - это жеско зашитый адрес WinExec из kernel32.dll db "cmd.exe /del C:\boot.ini", 0 так вот, при компиляции появляются нули (call $+5) и, самое главное, не больщинство опкодов не из диапазона 0x21-0x7e. Не подскажешь, как написать декодер? Ума не приложу - ведь, чтобы декодировать, необходимо указать на область памяти, которую декодировать. А это породит нулевые байты... Спасибо |
|
|
Дата: Июн 25, 2003 19:41:29 Аноним Интересно, это в какой системе WinExec имеет такой адрес -> 7789122? Это я к чему, в каждой системе свой адрес WinExec, или тебе не нужна универсальность кода? |
|
|
Дата: Июн 25, 2003 21:49:00 Аноним push esp pop eax sub eax,V1\ проделав данные операции sub eax,V2 >мы можем получить указатель на начало кода sub eax,V3/если только его нам не оставили в каком-нибудь регистре 8) push eax pop ebx а теперь несколько раз написав: sub al,v1 sub al,v2 это может не понадобится sub al,v3 это скороее всего не понадобится sub [ebx+byte],al мы можем раскодировать все байты декодера, а он уже раскодирует все остальное |
|
|
Дата: Июн 25, 2003 23:53:18 2Asterix Адрес такой у WinExec: 77E699C1 Система: Windows Server 2003 Enterprise Edition То, что указано 7789122 - так я же специально сказал, что пишу примерно, на скорую руку - не помню я на память (ну и разряд потерял впопыхах :). Понятно, что разный. Но я не нашел в модулях программы (которую экплоитирую) опкодов подходящих. А именно, call esp или jmp esp - для передачи управления моему коду. Если есть идея - буду очень благодарен. 2Black_mirror 1. Что есть V1, V2, V3? 2. Опкод sub eax, CONST начинается на 0x83, что уже выходит за рамки (0x7e). Как быть? Спасибо |
|
|
Дата: Июн 26, 2003 10:55:29 · Поправил: Black_mirror Ищи call esp/jmp esp в библиотеках которые использует программа. Допустим что у нас в регистре esp 00130d28, а код декодера начинается с адреса 00130a07. Нам нужно получить в каком-нибудь регистре число 001309e6, чтобы мы могли ссылатся на участок нашего кода как [reg+byte], 21h<=byte<=7eh. Чтобы получить такое число нам нужно вычесть 00000221h. Представим это число как сумму трех чисел V1, V2, V3: 55555555, 55555555 и 55555777. Возможно что то число которое мы хотим вычесть можно представить как сумму двух чисел, или оно вообще не содержит запрещенных байт, тогда можно сразу его вычитать. А код команды sub eax,const 2D. Приведи пожалуйста код функции, в которой происходит переполнение, с указанием какие значения имели регистры перед и после ее вызова. Или вышли мне программу на мыло, если она не очень большая, с указанием где найти эту функцию. |
|
|
Дата: Июн 26, 2003 12:01:24 2Black_mirror Я тебе позже отвечу подробно. Пока скажу только, что call esp/jmp esp в библиотеках которые использует программа НЕТ, я об этом писал выше. И машинный код для sub eax, CONST, например, для sub eax, 77h такой: 83E877. Понятно, что это зависит от разрядности константы (для 12345678h он действительно начинается на 2D), только мне необходимо отнимать смещения. |
|
|
Дата: Июн 26, 2003 17:36:41 sub eax,77h можно представить например так sub eax,5555557Dh sub eax,5555557Dh sub eax,5555557Dh или если al>=77h sub al,77h или вообще 77h раз написать dec eax ни в одном из этих вариантов запрещенных кодов нет Вмеcто esp можно использовать любой другой регистр, если он указывает на область которую мы можем затереть нашей строкой. |
|
|
Дата: Июн 27, 2003 16:04:45 Привет! Описываю ситуацию подробно. Есть код (упрощено): vuln(char * param) { char s[10]; strcpy(s, param); } int main(int argc, char * argv[]) { if(argc>1) { vuln(argv[1]); } else { printf("Sorry, no parameters given.\n"); } } Классическое переполнение буфера в функции vuln(…). Проблема в том, что строка, которую я могу передать как параметр программы (т.е. строка с shellcode) не может содержать ничего, кроме символов из диапазона ‘0’-‘9’, ‘a’-‘z’, ‘A’-‘Z’. Эта строка может иметь вид: [CODE1][JMP ESP ADDRESS][CODE2] где CODE1 и CODE2 – shellcode (alphanumeric), JMP ESP ADDRESS – это адрес инструкции JMP ESP (или CALL ESP) в одном из модулей программы (я не нашел, поэтому использую из системной библиотеки shell32.dll). Так вот, сразу после выхода из vuln мы попадаем на JMP ESP, а оттуда на начало кода CODE2. Какие проблемы: Необходимо расшифровать код, который идет в CODE2 после самого расшифровщика. Для этого нужно знать адрес, с которого расшифровывать, т.е. EIP. Да, скажете, это же значение в ESP. Верно, но как обратиться к N-ному байту после ESP, чтобы его раскодировать, если инструкции ADD REG нельзя использовать в силу их опкода? Все для Windows, максимальная длина CODE1 – 130 байт, CODE2 – 30 байт. Спасибо |
|
|
Дата: Июн 28, 2003 16:32:29 Посмотри внимательно мои предыдущие сообщения! |
|
|
Дата: Июн 29, 2003 00:54:08 2Black_mirror При всем уважении, тебе лучше перечесть мой предыдущий пост. И вот почему: код исполняется от младших адресов к старшим. Поэтому мне не отнимать надо, а прибавлять к ESP. Опкод add не входит в допустимый диапазон. Удачи |
|
|
Дата: Июн 29, 2003 04:08:59 Опкод add не входит в допустимый диапазон Замените ADD reg,N на SUB reg,-N и всё :-) |
|
|
Дата: Июн 29, 2003 04:13:32 Кстати, если вам не нравится минус в константе, -N можно разбить на несколько ASCII-совместимых значений. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.047 |