· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Как бы байты представить

. 1 . 2 . >>

Посл.отвђт Сообщен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-совместимых значений.

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.047