Форум программистов, компьютерный форум CyberForum.ru

Как понять эту строчку - C++

Восстановить пароль Регистрация
 
DUMP
54 / 28 / 7
Регистрация: 22.02.2015
Сообщений: 240
25.07.2016, 22:18     Как понять эту строчку #1
C++
1
2
3
4
5
char shellcode[]="hello worl\n"
int main()
{
    (* (int(*)()) shellcode) ();    // и что тут ?
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.07.2016, 22:18     Как понять эту строчку
Посмотрите здесь:

Как заполнить целочисленный массив введя с клавиатуры строчку из чисел C++
Преобразуйте эту строчку так, чтобы сначала в ней шли цифры, а потом - все буквы исходной строчки... C++
Объясните, как понять строчку в коде C++
Как в файле перейти на новую строчку? C++
Как получить номер(или какой нить индифиактор) текущей строки в открытом файле и перейти затем на эту строчку? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6458 / 3832 / 885
Регистрация: 30.01.2014
Сообщений: 6,628
25.07.2016, 22:29     Как понять эту строчку #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
DUMP, приведение массива к типу указателя на функцию (возвращает int, не принимает параметров) и вызов.
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
25.07.2016, 22:32     Как понять эту строчку #3
массив символов приводится к типу "указатель на функцию,
которая возвращает int, и не имеет параметров".

после чего этот указатель на функцию разыменовывается,
а через полученную таким образом ссылку на функцию выполняется запуск самой функции.

при этом содержимое массива интерпритируется,
как машинный исполняемый код функции.

и поскольку там бред - приложение падает.

--------------------------

в старину, отцы-основатели запихивали в массив цыферки реального машинного кода.
и приводя к указателю-на-функцию в рантайме генерировали исполняемый нативный код.

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

и потом, в наши дни привести массив к функции - не достаточно.
нужно ещё попросить операционную систему,
что бы она разрешила исполнять кусок памяти расположенный в секции "данных",
а не "исполняемого кода".
MansMI
Нарушитель
1047 / 844 / 205
Регистрация: 08.01.2012
Сообщений: 3,032
01.08.2016, 08:03     Как понять эту строчку #4
C++
1
2
3
4
5
6
7
8
9
10
    int code=0xC348C031;//xor eax,eax; dec eax; ret
    int n=25;
    int (*func)()=(int(*)())&code;
    _asm
    {
        lea ebx,code
        call ebx
        mov n,eax
    }
    cout<<((int(*)())&code)()<<"  "<<func()<<"  "<<n<<endl;
Yandex
Объявления
01.08.2016, 08:03     Как понять эту строчку
Ответ Создать тему
Опции темы

Текущее время: 13:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru