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, в которой хранится
  список   адресов   функций,  которые  будут  вызваны  при  завершении  работы
  программы.  Сюда  тоже  вполне  можно вписать адрес нашего аццкого кода и всё
  будет  работать  вполне  нормально.  Всё  довольно  просто,  за примерами - в
  сад.