работает шеллкод + vs2010 - PullRequest
1 голос
/ 15 октября 2011

Я только что попробовал следующий фрагмент кода для тестирования шелл-кода: -

#include<iostream>

using namespace std;

char sc[] = ""; #i've removed the shellcode
int main() {
    int (*func)();
    func = (int(*)())sc;
    (int)(*func)();
}

Я получаю ошибку сборки при компиляции: -

------ Build started: Project: shellcoderunner, Configuration: Debug Win32 ------
Build started 10/15/2011 12:51:16 PM.
InitializeBuildStatus:
  Touching "Debug\shellcoderunner.unsuccessfulbuild".
ClCompile:
  blah.cpp
c:\users\reverser\documents\visual studio 2010\projects\shellcoderunner\shellcoderunner\blah.cpp(7): error C2440: 'type cast' : cannot convert from 'char [149]' to 'int (__cdecl *)(void)'
          There is no context in which this conversion is possible

Build FAILED.

Time Elapsed 00:00:01.99
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Что-то очевидно, что я делаюнеправильно?

Ответы [ 4 ]

3 голосов
/ 17 октября 2012

Чтобы выполнить шелл-код в вашей программе на C / C ++ с VS, самый простой способ - встроить ассемблерный код, как показано в следующем примере:

char* buffer="blah blah blah";
int main() {
    __asm{
        lea eax, buffer
        call    eax
    }
}

Надеюсь, это поможет!

2 голосов
/ 15 октября 2011

Я думаю, что должно работать следующее:

char sc[] = ""; // i've removed the shellcode

int main()
{
    int (*func)() = (int(*)())sc;   // C++
    int (*func)() = sc;             /* C  */
    func();
}

Это технически неопределенное поведение, но опять же, в этом весь смысл шелл-кода.

2 голосов
/ 15 октября 2011

Вы не можете привести массив к указателю на функцию.Сначала вы должны получить указатель на массив, который затем можно привести:

func = (int(*)())&sc;
2 голосов
/ 15 октября 2011

[
В то время, когда я отвечаю, вопрос о том, почему компиляция не удалась для & hellip;

#include<iostream>

using namespace std;

char sc[] = ""; #i've removed the shellcode
int main() {
    int (*func)();
    func = (int(*)())sc;
    (int)(*func)();
}

Этот код является попыткой выполнить байты данных как машинный код. Однако OP называет это «фрагментом кода для целей тестирования шелл-кода», что никак не связано. И поэтому я включаю этот оригинальный контекст.
]

Вы можете успешно использовать void* в качестве посредника.

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

Однако, как сообщается, Posix требует возможности выполнять это преобразование, и это старая существующая практика, поэтому я полагаю, что большинство, если не все компиляторы, поддерживают это.

Обратите внимание, что вы находитесь на территории UB относительно эффектов.

Также обратите внимание, что проверка разрешений на выполнение антивирусного программного обеспечения и на уровне страниц может немного не совпадать с попыткой выполнить байты в строке как машинный код, так что на этом более высоком уровне вы делаете что-то явно неправильно. ; -)

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

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

Приветствия и hth.,

...