• XSS.stack #1 – первый литературный журнал от юзеров форума

Position-independent code

xChimera

Malware...
Пользователь
Регистрация
19.08.2024
Сообщения
778
Реакции
552
Гарант сделки
2
Депозит
0.0282
Делаю свой проект на плюсах
Импортов 0, все в динамике - вес бинарника менее 40 кб
Обьединял секции в одну - все равно вижу релокации, не понимаю почему и как с этим бороться
Тестировал как msvc так и g++(-fPIC не работает)

Цель - создание шеллкода, буду рад любым советам
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Обьединял секции в одну - все равно вижу релокации, не понимаю почему и как с этим бороться
А с чего им там не быть? Я могу понять, если ты под x64 пишешь, там хотя бы есть RIP-адресация, или как там это называется, а под x86 такого не будет, везде, где есть абсолютный адрес - будет релок. Посмотри, как, например, это сделано в donut'е: вся абсолютная адресация разруливается руками. Плюс к этому любой Vtable - абсолютные адреса, доступа к которым ты по факту не имеешь, большой switch - наиболее вероятно будет оптимизирован в jump-table с абсолютными адресами, любые статические данные, типа строк, вполне вероятно будут адресоваться абсолютно и тд и тп. Отключай стандартную библиотеку, клади все строки на стек, бери дизассемблер типа IDA Pro и смотри, где у тебя релоки появляются.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
А с чего им там не быть? Я могу понять, если ты под x64 пишешь, там хотя бы есть RIP-адресация, или как там это называется, а под x86 такого не будет, везде, где есть абсолютный адрес - будет релок. Посмотри, как, например, это сделано в donut'е: вся абсолютная адресация разруливается руками. Плюс к этому любой Vtable - абсолютные адреса, доступа к которым ты по факту не имеешь, большой switch - наиболее вероятно будет оптимизирован в jump-table с абсолютными адресами, любые статические данные, типа строк, вполне вероятно будут адресоваться абсолютно и тд и тп. Отключай стандартную библиотеку, клади все строки на стек, бери дизассемблер типа IDA Pro и смотри, где у тебя релоки появляются.
Скрытый контент для пользователей: .
 
Ты не кодил их раньше? Почитай вот например матчасть https://www.orderofsixangles.com/translations/2021/06/12/shellcoding.html
Полноценные проекты в шеллкод - нет, небольшие на си - да


Строки и вызов апи как у тебя идут?
Строк минимум, вижу что у них релокация, перенесу в динамику - фиксану
Также тут статик переменные, тоже надо будет пофиксить
Вызовы апи все в динамике через peb поиск, тоесть иат чистый
Нет абсолютно ничего в бинарнике, только 2 секции(текст и релоки) - дата директори чист
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
Строк минимум
Все строки перенеси в стек или еще куда; посмотри как вызываются функции (не должно быть релоков, но хз что там компилер мутит).
Возьми прогу PE Bear / cff эксплорер, смотри таблицу релоков, дальше смотри в Ида что это за смещение, и какому месту в исходниках оно соответствует.
 
Все строки перенеси в стек или еще куда; посмотри как вызываются функции (не должно быть релоков, но хз что там компилер мутит).
Возьми прогу PE Bear / cff эксплорер, смотри таблицу релоков, дальше смотри в Ида что это за смещение, и какому месту в исходниках оно соответствует.
1749501439863.png


1749501455005.png

вот такие моменты, + синглтон классы
 
Пожалуйста, обратите внимание, что пользователь заблокирован
вот такие моменты,
Тут строка, но за ООП ничего не подскажу; попробуй нативные строки юзать (WCHAR) ну или поменяй реализацию этих, хз.
 
Тут строка, но за ООП ничего не подскажу; попробуй нативные строки юзать (WCHAR) ну или поменяй реализацию этих, хз.
там все чисто, тут именно статик потому что, если вынести то все хорошо будет
 
Скрытый контент для пользователей: .
 
Посмотри в сторону рефлектив лоадеров (самая известная реализация). Лоадер должен быть на чистом C в идеале. По содержанию самого лоадера говорить ничего не буду, но схема в целом должна быть такая: генеришь *asm листинг своим компилером (clang-ом проще всего), удаляешь все строки из листинга где данные (символы, строки, etc) пихаются в .*data секции, суешь прямой прыжок на начало твоего шеллкода-лоадера (jmp shellcode_entry) в начало листинга, компилишь это все в obj, потом в exe, дампишь .text-секцию (с кодом) и все. Профит, твоя .text секция это и есть готовый лоадер. А как ты в самом лоадере уже реализуешь поиск основного экзешника в памяти и его загрузку - дело твое). Если кодишь хорошо, то итоговый лоадер будет где-то 2.5-3 кб.
P.S Полезные линки:
 
написал релокатор, затем внес правки в асм
суть - просто применяет релокации к коду без каких либо выделений (шеллкод же в рвx)
шеллкод релокатор вышел в 210 байт

1749643188367.png
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
шеллкод же в рвк
Кстати, огнелис передаёт привет:
C++:
static bool
ShouldBlockThread(void* aStartAddress)
{
  // Allows crashfirefox.exe to continue to work. Also if your threadproc is null, this crash is intentional.
  if (aStartAddress == 0)
    return false;

  bool shouldBlock = false;
  MEMORY_BASIC_INFORMATION startAddressInfo = {0};
  if (VirtualQuery(aStartAddress, &startAddressInfo, sizeof(startAddressInfo))) {
    shouldBlock |= startAddressInfo.State != MEM_COMMIT;
    shouldBlock |= startAddressInfo.Protect != PAGE_EXECUTE_READ;
  }

  return shouldBlock;
}

// Allows blocked threads to still run normally through BaseThreadInitThunk, in case there's any magic there that we shouldn't skip.
static DWORD WINAPI
NopThreadProc(void* /* aThreadParam */)
{
  return 0;
}

static MOZ_NORETURN void __fastcall
patched_BaseThreadInitThunk(BOOL aIsInitialThread, void* aStartAddress,
                            void* aThreadParam)
{
  if (ShouldBlockThread(aStartAddress)) {
    aStartAddress = (void*)NopThreadProc;
  }

  stub_BaseThreadInitThunk(aIsInitialThread, aStartAddress, aThreadParam);
}
 
Кстати, огнелис передаёт привет:
Новых потоков не создает софт, потому без разницы
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх