m o n s t e r i n m y p o c k e t
Превед, сегодня мы поговорим о новых (в может и не очень) техниках для
unix (ELF-based) вирей. Набросок статьи месяца 3 назад выглядел так:
infecting dtors/got
# <some_there_evil_code_sits>
<do_evil_stuff>
<infect philez>
<syscall exit()>
...
# <dtors>
<addr1>
<addr2>
..
<addr_of_evil_code>
Если кто не понял, то далее идёт пояснение. Задача - статическое заражение
файла, необходимо передать управление вредноносному коду при этом не влияя
на работоспособность программы-носителя. Решения:
GOT (Global Offset Table)
Просто таблица адресов функций которые подгружаются из внешних библиотек.
При первом обращении в соответствующей записи dtors содержится адрес
соответствующего обработчика в секции PLT (механизм его работы и техника
внедрения кода в PLT подробно описаны в статье static libc calls hook). GOT
выглядит примерно так:
<GOT>:
<addr of libc dlinker>
0x00000000
0x00000000
<plt1 + offs> # printf()
<plt2 + offs> # system()
...
Тоесть первые три записи используются для линковки, а последующие содержат
адреса вызываемых внешних функций (в данном случае printf() и system() просто
для примера). Допустим в некотором сегменте у нас вписан кусок нашего кода,
соответственно адрес на него вписываем в какую-нибудь из записей GOT (к
примеру соответствующую printf()-у). Далее выполняется наш код. В конце его
работы нужно вернуть управление программе-носителю, для этого прыгаем в ту
секцию PLT, собственно которая и обеспечивает вызов линковки printf(). После
этого адрес в GOT будет перезаписан адресом данной функции в libc() и всё
пройдёт гладко.
PLT (Procedure Location Table)
Способ внедрения кода сюда подробно описан в статье static libc calls hook.
DTORS
А теперь самое весёлое - есть такая секция .dtors, в которой хранится
список адресов функций, которые будут вызваны при завершении работы
программы. Сюда тоже вполне можно вписать адрес нашего аццкого кода и всё
будет работать вполне нормально. Всё довольно просто, за примерами - в
сад.