информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Все любят медПортрет посетителяSpanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[Win32] функции в сегменте кода 18.11.02 22:36  Число просмотров: 1273
Автор: + <Mikhail> Статус: Elderman
<"чистая" ссылка>
> киньте плиз исходник по сабжу. Помню, пару месяцев назад
> проходил он по форуму, вроде =)) поискал в history, но не
> нашел ...
> спасиб!
dlia VC:
tolko v Release build optimizaciu vykluchi ( ili poigraisia s nei )
void* alloc_foo(void *pFoo,void *pFooNext)
{
	long *p1, *p2;
#ifdef _DEBUG
	p2 = (long*)(long*)&((charpFooNext)[1] + (long)pFooNext + 5);
	p1 = (long*)(long*)&((charpFoo)[1] + (long)pFoo + 5);
#else
	p2 = (long*)pFooNext;
	p1 = (long*)pFoo;
#endif
	int size_of_function;
	size_of_function  = (int)p2 - (int)p1;

	char *p = new char[size_of_function];
	memcpy(p, p1, size_of_function);
	return p;
};

void  free_foo(void *pFoo)
{
	delete []pFoo;
}


void FooInDataSec(void *p)
{
	void*  pmemcpy)(voidconst void*, size_t) = &memcpy;
	pmemcpy(p, "test\0", 5);
}

void FooInDataSec_0(void *p){}

void main()
{
	void pFooInDataSec)(void;
	pFooInDataSec = alloc_foo(FooInDataSec, FooInDataSec_0);
	char sz[5];
	pFooInDataSec(sz);
	free_foo( pFooInDataSec );
	printf("%s", sz);
}

---
<programming>
[Win32] функции в сегменте кода 18.11.02 19:02  
Автор: fuckyoudude Статус: Незарегистрированный пользователь
<"чистая" ссылка>
киньте плиз исходник по сабжу. Помню, пару месяцев назад проходил он по форуму, вроде =)) поискал в history, но не нашел ...
спасиб!
[Win32] А они все там и есть 19.11.02 13:33  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
Если в сегменте данных, то главное не компиль Debug-версию, в ней все вызовы сопровождаются _chkesp() - а если ты переместишь функцию с таким вызовом куда нить в кучу или в переменную, или на стек - вызов останется, но будет указывать незнамо куда
[Win32] А они все там и есть 19.11.02 22:25  
Автор: + <Mikhail> Статус: Elderman
<"чистая" ссылка>
> Если в сегменте данных, то главное не компиль Debug-версию,
> в ней все вызовы сопровождаются _chkesp() - а если ты
> переместишь функцию с таким вызовом куда нить в кучу или в
> переменную, или на стек - вызов останется, но будет
> указывать незнамо куда

_chkesp() mozhno otkluchit` v _DEBUG
опечатался =) , конечно я про сенгмент данных спрашивал)))... 19.11.02 22:13  
Автор: fuckyoudude Статус: Незарегистрированный пользователь
<"чистая" ссылка>
опечатался =) , конечно я про сенгмент данных спрашивал)))... 20.11.02 13:59  
Автор: Green Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Я делаю так:

#pragma comment(linker,"/MERGE:.text2=.data")
#pragma comment(linker,"/SECTION:.data,EWRX")

#pragma code_seg(".text2")
void func(...)
{
..........
}
Это действительно компильнет функцию в data_seg, но 20.11.02 16:32  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
Хотя компилер и матюкнется на несоответствие флагов секций
Насколько я понял, запустить нужно именно уже созданную функцию (шеллкод например), которая находится в переменной например. В общем то запустить - не проблема: и code_seg и data_seg - flat сегменты. Проблема как раз в том, чтоб эта самая функция была правильно написана: об chkesp я уже говорил - ее быть не должно любыми путями, кроме того если нужно использовать вызовы C-шной RTL, следует иметь в виду, что call на них генерится с относительной адресацией (относительно текущей инструкции - переместится call - все вызовы пойдут по левым адресам), код должен быть релоцируемым (если фиксапы нужны - их нужно выполнить самому до вызова функции), а так далее
[Win32] функции в сегменте кода 18.11.02 22:36  
Автор: + <Mikhail> Статус: Elderman
<"чистая" ссылка>
> киньте плиз исходник по сабжу. Помню, пару месяцев назад
> проходил он по форуму, вроде =)) поискал в history, но не
> нашел ...
> спасиб!
dlia VC:
tolko v Release build optimizaciu vykluchi ( ili poigraisia s nei )
void* alloc_foo(void *pFoo,void *pFooNext)
{
	long *p1, *p2;
#ifdef _DEBUG
	p2 = (long*)(long*)&((charpFooNext)[1] + (long)pFooNext + 5);
	p1 = (long*)(long*)&((charpFoo)[1] + (long)pFoo + 5);
#else
	p2 = (long*)pFooNext;
	p1 = (long*)pFoo;
#endif
	int size_of_function;
	size_of_function  = (int)p2 - (int)p1;

	char *p = new char[size_of_function];
	memcpy(p, p1, size_of_function);
	return p;
};

void  free_foo(void *pFoo)
{
	delete []pFoo;
}


void FooInDataSec(void *p)
{
	void*  pmemcpy)(voidconst void*, size_t) = &memcpy;
	pmemcpy(p, "test\0", 5);
}

void FooInDataSec_0(void *p){}

void main()
{
	void pFooInDataSec)(void;
	pFooInDataSec = alloc_foo(FooInDataSec, FooInDataSec_0);
	char sz[5];
	pFooInDataSec(sz);
	free_foo( pFooInDataSec );
	printf("%s", sz);
}

---
[Win32] сенк, есть над чем подумать! есть еще неясность! 18.11.02 23:22  
Автор: fuckyoudude Статус: Незарегистрированный пользователь
<"чистая" ссылка>
а нельзя так:
/*
* тут собсно-функция
*/
char func="\xZZ\xZZ...\xZZZ";

void (*f)(void);

int main(void)
{
f = (void*)func;
(*f)();
return 0;
}

я слышал, что можно так, но MSVC не компилит ( f = (void*)func; ) , говорит мол '=' can't convert (void*) to void (__cdecl * )(void)
:(
[Win32] сенк, есть над чем подумать! есть еще неясность! 19.11.02 01:20  
Автор: + <Mikhail> Статус: Elderman
<"чистая" ссылка>
> а нельзя так:
> /*
> * тут собсно-функция
> */
> char func="\xZZ\xZZ...\xZZZ";

char *func = "...";

>
> void (*f)(void);
>
> int main(void)
> {
> f = (void*)func;

f = (void (__cdecl *)(void))func;

> (*f)();

f();

> return 0;
> }
>
> я слышал, что можно так, но MSVC не компилит ( f =
> (void*)func; ) , говорит мол '=' can't convert (void*) to
> void (__cdecl * )(void)
> :(
[Win32] сенк, есть над чем подумать! есть еще неясность! 19.11.02 22:20  
Автор: fuckyoudude Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> > void (*f)(void);
....
> > (*f)();
>
> f();
здесь все-таки (*f)();
т.к определен указатель на функцию =)

Cенк за помощь.
Всего!
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach