|
[Jan. 3rd, 2008|12:37 pm] |
[ | Current Mood |
| | giggly | ] |
zloiuser@lj запостил ссылку на зин defaced. забавные они.
С помощью ELF бинарников можно определить версию оси. В самом начале elf-
заголовка идёт e_ident[]. Это массив из 16 байт, вот они:
А вот самый обыкновенный линуксовый бинарь:
00000000 7F 45 4C 46 01 01 01 00 00 00 00 00 00 00 00 00 .ELF............
Что у нас тут? Правильно ELFOSABI_NONE. Заглянули бы в загрузчик FreeBSD, там на эту тему был роскошный длинный комментарий. Не говоря уже о всяких феерических способах брендинга. Даже вспомнился очень давний флейм на эту тему в фидошке. Ж-)
Про IP адреса и push/ret - это даже не баян. CALL-ы/JMP-ы - улыбнуло. С затиранием .fini (подонковские словечки: "инфецирование" - напрягают) понравилось - простенько и со вкусом, только в этом месте автор зажег:
Теперь попробуем автоматизировать процесс, будем находить секцию .fini
автоматически. Суть в том что у .fini будет фиксированный размер. Стало быть
секцию эту можно найти по размеру (0x1b для Linux и 0x06 для FreeBSD).
Алгоритм такой: из elf заголовка вытягиваем адрес табилцы секций,
Если вы знаете автора, то скажите ему, что можно просто искать секции по имени:
char *strtab = (char*)ehdr + shdr[ehdr->e_shstrndx].sh_offset;
for (...)
if (! strcmp(strtab + shdr[i].sh_name, ".fini"))
...
Увы, такие утилиты как sstrip... Решение - поиск .fini по сигнатуре.
Своеобразно :-) Можно было бы и попроще, что-нибудь, к примеру DT_FINI в .dynamic.
"Нейродизассемблер" я комментировать не буду, немедленно скачивайте журнал и читайте сами. Оно того стоит. Ж-))) |
|
|