herm1t LIVE!ng room - July 10th, 2009 [entries|archive|friends|userinfo]
herm1t

[ website | twilight corner in the herm1t's cave ]
[ userinfo | ljr userinfo ]
[ archive | journal archive ]

July 10th, 2009

Угадайка [Jul. 10th, 2009|02:22 pm]
[Tags|, , ]

Написал небольшое продолжение этого проекта. "Linker" таскает за собой таблицу релоков, "Linker G" (guess what is G for?) их "угадывает". Идея в следующем: процесс живет в четырёх-гигабайтном адресном пространстве, из которого только крохотная часть - это код и данные вируса. В данном случае 4 килобайта. Неплохое соотношение. А поэтому, выдаём вирусу дизассемблер (1 шт.) и вперёд - парсить свой код на наличие констант похожих на адреса. Дальше просто - копируем тушку в жертву и из каждой найденной константы вычитаем базовый адрес вируса в текущем процессе и добавляем базовый адрес вируса же в файле-жертве. Константами со значением близким к 0x08049000 по понятным причинам лучше не пользоваться. libc вызывается довольно извращённым способом, но это можно и переделать, нельзя использовать .bss, но это от лени. :-) всё. вот так выглядит relocate() в версии G ) В принципе, можно применить этот вариант и к жертве, но стрёмно, двух простых правил маловато, чтобы отличить константу от адреса, хотя вероятность напороться не очень высока. Я считал.

Скачать исходники, бинари. Тестировано на RHEL 5.3. (оно немного глючит. но это же альфа, просто, чтобы показать идею.

Осталось добавить ещё третий вариант, когда вирус добавляет свои релоки в .rel.dyn, тогда всю работу выполнит RTLD. И никакого, блядь, ассемблера, дельт злоебучих, массивов заполняемых push и mov и прочей ахинеи. :-)

LinkLeave a comment

navigation
[ viewing | July 10th, 2009 ]
[ go | Previous Day|Next Day ]