LINUX.ORG.RU

Помогите в подготовке к экзамену))


0

0

Ммм... Мне надо придумать примеры прог. Но замкнутый круг. Я несколько не понимаю вопросы, поэтому не могу написать нужные программы. Но в то же время я не могу разобрать вопросы без примера. Может хоть парочку подскажите?)) 1. Стандартные переопределения типов (stddef.h) на примере собственной функции strlen с возвращаемым значением типа size_t. 2. Пример фрагмента кода обхода линейного списка (это со структурой). 3. Пример фрагмента кода вставки элемента в список. 4. Пример программы, использующей переполнение буфера для подмены адреса возврата (это про стек). 5. Сильные и слабые имена программ с несколькими модулями с совпадением имен.


>4. Пример программы, использующей переполнение буфера для подмены адреса возврата (это про стек).

Вот это действительно интересно, и как предполагается передавать адрес другой точки входа и откуда она берётся? И главное, ЗАЧЕМ?

SV0L0CH
()
Ответ на: комментарий от SV0L0CH

Вот стек - это самое больное... Может, имеется ввиду, надо просто написать какую-нибудь функцию, нарисовать картиночку и показать, как мы в него входим, берём и выходим?))

Holly
() автор топика

> 4. Пример программы, использующей переполнение буфера для подмены адреса возврата

o_O
мсье учится на кулхацкера?

opensuse
()
Ответ на: комментарий от Holly

Порядок следования аргументов и точки возврата в функциях может отличатся, для каких как я не помню.

void fuc1(){void* var; *(&var+1)=enother_return_point;}

void fuc2(void* arg){*(&arg+1)=enother_return_point;}

void fuc3(void* arg){*(&arg-1)=enother_return_point;}

Первый вариант будет работать в большенстве известных мне случаев, второй и третий в зависимости от того как функция объявлена (можно уточнить в справочнике).

SV0L0CH
()
Ответ на: комментарий от opensuse

>мсье учится на кулхацкера?

мсье учится _У_ кулхацкера

SV0L0CH
()
Ответ на: комментарий от Holly

>Страхи, что в скором будущем вообще нигде не учится)

Учится и работать надо не отходя от касы и не отрывая жопу от подушки.

SV0L0CH
()
Ответ на: комментарий от SV0L0CH

Я предпочитаю держать её на матрасе)

Holly
() автор топика

По первому и пятому пункту вообще нихрена не понял, видать препод альтернативно одарённый, и нам не понять его прекрасных формулировок глубоких мыслей. :-/

SV0L0CH
()

>2. Пример фрагмента кода обхода линейного списка (это со структурой).

3. Пример фрагмента кода вставки элемента в список.


Берём любую книгу и сдираем. Даже в моей старой книге по паскалю это было, если я правильно понимаю о чём это. Впрочем, и логикой тут додумать несложно.

И тут внезапно 4 пункт. Как-то не особенно стыкуется с предыдущими.

// а вообще, спать пора :\

Deleted
()
Ответ на: комментарий от SV0L0CH

> Порядок следования аргументов и точки возврата в функциях может отличатся, для каких как я не помню.

void fuc1(){void* var; *(&var+1)=enother_return_point;}

void fuc2(void* arg){*(&arg+1)=enother_return_point;}

void fuc3(void* arg){*(&arg-1)=enother_return_point;}

Первый вариант будет работать в большенстве известных мне случаев, второй и третий в зависимости от того как функция объявлена (можно уточнить в справочнике).

В х86_64 часть аргументов передаётся в регистрах. Размер стек-фрейма зависит от функции и от флагов компилятора. Так что примеры - на свалку

Если бы топикстартер имел мозг и знал бы хотя бы ассемблер для своей архитектуры и ABI/Calling convention - вопросы бы отпали. Это я к тому, что нужно почитать для решения задачи.

anonymous
()

Предлагаю тебе для ачала реализовать пункты 2 и 3. Если у тебя это самостоятельно не получится - на остальное можешь просто забить (читай переводится на другую специальность / отчислятся).

Если осилишь, тогда уже начинай про остальное спрашивать.

trex6 ★★★★★
()
Ответ на: комментарий от anonymous

Помогите бабе, ёпте.

Эээх... Наверное я поступаю неправильно. Кормить тролей и студентов плохая идея, они так никогда не переведутся. Вот «copy/paste» специально для тебя Holly. Код постарался сделать «поговнистее», чтоб без палева было.

1. Стандартные переопределения типов (stddef.h) на примере собственной функции strlen с возвращаемым значением типа size_t.

Как-то мутно сказано, но думаю хотели это

#include <stdio.h>
#include <stdef.h>

size_t my_strlen(char* str)
{
	size_t len = 0;
	char* pos = str;
	while((*pos)!='\0')
	{
		len++;
		pos++;
	}
	return len;
}

int main()
{
	char* text = "abcde";
	printf("len=%d\n",my_strlen(text));
}

2. Пример фрагмента кода обхода линейного списка (это со структурой). 3. Пример фрагмента кода вставки элемента в список.

Вот однонаправленный линейный список

#include <stdio.h>

struct _mylist
{
	int value;
	struct _mylist *next;
};
typedef struct _mylist mylist;

//Функция добавления элемента в список
void mylist_add(mylist* current,mylist* to_add)
{
	mylist* old_next = current->next;
	current->next = to_add;
	to_add->next = old_next;

	printf("add %d item after %d item\n",to_add->value,current->value);
}

int main()
{
	mylist* head = new mylist;
	head->value = 0;
	head->next = NULL;

	mylist* last_node = head;

	for(int i=1;i<100;i++)
	{
		mylist* node = new mylist;
		node->next=NULL;
		node->value=i;
		mylist_add(last_node,node);
		last_node = node;
	}

	//Здесь перебираем все элементы и освобождаем память, выделенную для них
	mylist* next_node = head;
	while(next_node!=NULL)
	{
		mylist* node = next_node;
		next_node = node->next;
		delete node;
	}
	return 0;
}

4. Пример программы, использующей переполнение буфера для подмены адреса возврата (это про стек).

Скажи преподу, чтоб завязывал с ганджубасом.

5. Сильные и слабые имена программ с несколькими модулями с совпадением имен.

А вот тут я ничего не понял. Какие имена программ ? Какие ещё модули?

pathfinder ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.