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

Динамически вычислить адрес функции и обфусцировать

cppjunior

ripper
КИДАЛА
Регистрация
25.05.2022
Сообщения
57
Реакции
3
Гарант сделки
2
Пожалуйста, обратите внимание, что пользователь заблокирован
Должно получиться такое :
Код:
public start
start proc near
lea     rcx, start
push    rcx
pop     rdx
add     rcx, 4E20h
add     rdx, 2764h
jmp     rdx
start endp

А получается вот такое)

Код:
main proc near
var_18= qword ptr -18h
sub     rsp, 38h
lea     rcx, sub_140001000
call    sub_140001090
mov     [rsp+38h+var_18], rax
mov     rcx, [rsp+38h+var_18]
call    sub_1400010B0
call    rax
xor     eax, eax
add     rsp, 38h
retn

Код:
C++:
template <class T>
inline T obfuscate_address(T addr) {
    return reinterpret_cast<T>(reinterpret_cast<std::uintptr_t>(addr) + 1337 );
}

template <class T>
inline T deobfuscate_address(T addr) {
    return reinterpret_cast<T>(reinterpret_cast<std::uintptr_t>(addr) - 1337 );
}

const auto obfuscated_foo = obfuscate_address(&test);
deobfuscate_address(obfuscated_foo)();

Как добиться желаемого результата?)
 
C:
void EntryPoint() // this is the entry point of the program
{
    __asm__("lea EntryPoint(%rip), %rcx"); // get the address of the current function
    __asm__("push %rcx"); // push the address of the current function onto the stack
    __asm__("pop %rdx"); // pop the address of the current function into rdx
    __asm__("add $0x4E10, %rcx"); // add 0x4E to the address of the current function
    __asm__("sub $0x38, %rdx"); // subtract 0x38 from the address of the current function
    __asm__("jmp *%rdx"); // jump to the address of the current function minus 0x38 (the address of the fakeFunc function)
}
 
Ну сконверти свой бинарь в ассемблер и обфусцируй его как тебе угодно, зачем использовать костыли с шаблонами и асм вставками?
Имеется гайд какой-нибудь?
 
Имеется гайд какой-нибудь?

гайд такой
1) Учишь ассемблер
2) Реверсишь код некоторое время, что бы понять как все работает на низком уровне
3) Накопленные знания используешь для достижения поставленной цели

Ассемблерный листинг бинаря можно достать из Ghidra\IDA\ других подобных инструментов
А дальше только применять знания для обфускации, методов очень много
 
Пожалуйста, обратите внимание, что пользователь заблокирован
за плюсы не знаю, в Си нужно юзать naked fn, т.е. самому писать пролог https://learn.microsoft.com/en-us/cpp/c-language/naked-functions?view=msvc-140
мб что-то еще.


там 64 бит, RIP адресация, а ТС нужно 32.
Да не, там и на 32 битах работает, я делал что-то похожее для генератора мусора, там тоже у меня был массив адресов функций, смещения портились в компильтайме, а в рантайме восстанавливались прям перед вызовом, оно и на 32 и на 64 пашет

На 32 просто не от rip адресует, а через табличку в дата-секции, которая содержит в себе просто адреса функций+смещение, в случае с dll на 32 битах эти адреса так же в релоки добавляются и там все нормально при ребазировании модуля
 


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