ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > Программирование > Реверсинг
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Подмена адреса возврата с маскировкой
  #1  
Старый 13.02.2010, 20:08
VERte][
Moderator - Level 7
Регистрация: 17.05.2007
Сообщений: 220
Провел на форуме:
3013539

Репутация: 441
По умолчанию Подмена адреса возврата с маскировкой

Имеется такой кусок кода:

Код:
void B()
{}

void A(int E_addr)
{}

int main()
{
    A(((int)B)^12345);
    return 0;
}
вопрос: как сделать чтоб выражение ((int)B)^12345 вычислялось на стадии компиляции? у меня что в M$, что в gcc компилируется только в виде:

Код:
mov eax, offset B
xor eax, 12345d
с чего я взял, что вообще так можно:
http://www.insidepro.com/kk/199/199r.shtml смотрим "Маскировка указателей", Крис утверждает, что у него все ок, достаточно лишь установить флаг компиляции /Ox (-O2).
У меня, как я уже сказал, не на мс, не на гцц компилерах не работает (перебрал хуеву тучу возможных комбинаций флагов и там и там)
Кто сталкивался с такой штукой отпишитесь. И да, сделать надо чисто методами C, т.е. взять hiew и там вписать нужное значение, забив лишнее nop'ами не прокатит (хотя это и решение, но задание было дано так)

Весь код, кому интересно:
Код:
#include <stdio.h>
#include <stdlib.h>

#define PASS 12345

void B()
{
    printf("%s \n", "Hello world");
    exit(0);
}

void _cdecl A(int E_addr)
{
    int pass;
    scanf("%d", &pass);
    pass^=E_addr;
    *(((int*)&E_addr)-1)=pass;
}

int main()
{

#ifdef _ATT
    asm("int $0x3");
#endif
#ifdef _INTEL
    _asm{int 0x3};
#endif

    A(((int)B)^PASS);
    return 0;
}
В планах реализовать защиту таким способом, что адрес перехода на full version функции программы будет замаскирован на некотором пароле (даже скорее всего на хэше пароля), в результате чего только правильный ввод пароля даст доступ к полной версии. В связи с этим естественно, что в программе выражение ((int)B)^PASS должно быть вычисленно на стадии компиляции.

Последний раз редактировалось VERte][; 13.02.2010 в 20:23..
 
Ответить с цитированием

  #2  
Старый 14.02.2010, 00:46
VERte][
Moderator - Level 7
Регистрация: 17.05.2007
Сообщений: 220
Провел на форуме:
3013539

Репутация: 441
По умолчанию

Хоть кто-нибудь попробуйте покомпилить у себя на разных компилерах и системах, ибо имхо идея такой закщиты вполне интересна, если уж нигде не будет работать то придется все-таки хитрить через hiew, либо ещё как
 
Ответить с цитированием

  #3  
Старый 14.02.2010, 16:58
Protorus
Новичок
Регистрация: 17.01.2010
Сообщений: 23
Провел на форуме:
118852

Репутация: 0
По умолчанию

на С не пишу, но может так можно
Код:
asm{
push &B ^ 12345
call &A
}
 
Ответить с цитированием

  #4  
Старый 14.02.2010, 22:48
VERte][
Moderator - Level 7
Регистрация: 17.05.2007
Сообщений: 220
Провел на форуме:
3013539

Репутация: 441
По умолчанию

В том то и дело что так нельзя, ибо задание - сделать это только методами чистого с со стандартной библиотекой, без всяких ассемблерных вставок, в расчете на переносимость такого метода защиты. Во-вторых такая вставка не должна работать в принципе. Решение точно связано с работой компилятора, может какие-то директивы есть, чтоб компановка не происходила до тех пор пока не будут вычислены все адреса и выражения с ними
 
Ответить с цитированием

  #5  
Старый 16.02.2010, 14:33
kori256
Познающий
Регистрация: 07.02.2009
Сообщений: 89
Провел на форуме:
3029180

Репутация: 106
Отправить сообщение для kori256 с помощью ICQ
По умолчанию

Цитата:
Компилируем программу (не забыв задействовать оптимизацию, чтобы компилятор зашифровал указатель еще на стадии компиляции; в Microsoft Visual C++ это достигается путем указания ключа /Ox, в других компиляторах это может быть ключ -O2 или что-то другое, описанное в справочном руководстве).
не нашел где включить это в своем xcode, возможно в этом проблемма?
 
Ответить с цитированием

  #6  
Старый 16.02.2010, 19:24
sn0w
Статус пользователя:
Регистрация: 26.07.2005
Сообщений: 568
Провел на форуме:
1290766

Репутация: 1236


По умолчанию

Код:
int B2 = (int)B^1234;
void B()
{}

void A(int E_addr)
{}

int main()
{
    A(B2);
    return 0;
}
или я чето не понял?
__________________


snow white world wide
 
Ответить с цитированием

  #7  
Старый 17.02.2010, 00:39
VERte][
Moderator - Level 7
Регистрация: 17.05.2007
Сообщений: 220
Провел на форуме:
3013539

Репутация: 441
По умолчанию

Цитата:
Сообщение от sn0w  
Код:
int B2 = (int)B^1234;
void B()
{}

void A(int E_addr)
{}

int main()
{
    A(B2);
    return 0;
}
или я чето не понял?
ну если точнее, то

Код:
void B()
{}
int B2 = (int)B^1234;
но тут засада:
C:\Users\Vertex\Documents\test\main.c|12|error: initializer element is not constant| на строчке int B2 = (int)B^1234;

Выходит, что gcc считает, что адреса имен неизвестны (хотя вполне очевидно, что адреса в готовом приложении вполне известны, так как обычно они делаются фиксированными в отличии от dll). В вижуал студии в настройках пробовал фиксировать адрес базы, но тоже не дало результата =( Вообщем у Касперски волшебные компиляторы =(
 
Ответить с цитированием

  #8  
Старый 17.02.2010, 11:19
Hiro Protagonist
Участник форума
Регистрация: 26.08.2009
Сообщений: 133
Провел на форуме:
193434

Репутация: 79
Отправить сообщение для Hiro Protagonist с помощью ICQ
По умолчанию

попробуй отключить релоки (чето типа strip relocations).
>>хотя вполне очевидно, что адреса в готовом приложении вполне известны
Это не очевидно, в соответствии с форматом PE, все отображения могут перемещаться (exe и dll с точки зрения формата не сильно отличаются). В exe можно отрубать релоки. Возможно тогда компилятор посчитает адрес константным.
 
Ответить с цитированием

  #9  
Старый 17.02.2010, 14:19
sn0w
Статус пользователя:
Регистрация: 26.07.2005
Сообщений: 568
Провел на форуме:
1290766

Репутация: 1236


По умолчанию

не, я и с динамичной базой включал и тд - все работает,
компилер из студии 2008
__________________


snow white world wide
 
Ответить с цитированием

  #10  
Старый 17.02.2010, 20:06
VERte][
Moderator - Level 7
Регистрация: 17.05.2007
Сообщений: 220
Провел на форуме:
3013539

Репутация: 441
По умолчанию

Цитата:
Сообщение от Hiro Protagonist  
попробуй отключить релоки (чето типа strip relocations).
>>хотя вполне очевидно, что адреса в готовом приложении вполне известны
Это не очевидно, в соответствии с форматом PE, все отображения могут перемещаться (exe и dll с точки зрения формата не сильно отличаются). В exe можно отрубать релоки. Возможно тогда компилятор посчитает адрес константным.
Релоки отключал, студия как и у sn0w 2008я, но вот почему-то не работает =(
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
подмена адреса Rav1n О Работе 7 03.04.2009 09:12
Подмена адреса! kapadult Уязвимости 13 21.02.2009 20:17
Подмена Mac и Ip адреса ReVOLVeR Защита ОС: вирусы, антивирусы, файрволы. 19 04.01.2007 14:43
Публичные Smtp и подмена адреса отправителя V01anD E-Mail 24 10.09.2006 23:19



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ