【问题标题】:Testing a shellcode测试一个shellcode
【发布时间】:2010-05-09 14:49:17
【问题描述】:

我有这段代码来测试一个shellcode,但我不明白,谁能给我解释一下?

忘记汇编shellcode,我要理解的是C代码,

char shellcode[] = "...";

int main(int argc, char **argv)

{

int (*func)();

func = (int (*)()) shellcode;

(int)(*func)();

}

我的意思是一切,空的()是什么,请解释一下,就像你在给初学者解释一样。

【问题讨论】:

  • 由于 shell 代码“不重要”,我已经省略了它(为了安全起见)。
  • 用户名似乎是获取 CIA 和 GCHQ 数据库的好方法。连同这个问题,您可能随时可以期待 SAS 的访问......

标签: c shellcode


【解决方案1】:
int (*func)();

这是一个函数指针的声明。函数指针本质上是一个保存函数地址的变量。在这种情况下,func 指向的函数类型是不带参数并返回 int 的函数类型。您可以将函数的地址分配给此变量,如下所示:

func = foo;

其中foo 是一个原型为int foo(); 的函数。

一旦一个函数被赋值给这个变量,你就可以像这样调用func指向的函数:

(*func)();

还有一种替代语法(等效),我认为更清楚:

func();

因此,如果将foo 分配给func,那么上面的两个示例实际上都会调用函数foo。

您还可以将值转换为函数指针。在代码示例中

(int (*)())

是对不带参数并返回int 的函数指针的强制转换。这样编译器就不会抱怨将本质上是 char* 的内容分配给函数指针 func。

在您上面给出的代码中,还有最后一件事。在调用func 之后,结果(出于某种原因)转换为int。据我所知,这个演员阵容完全没有必要。所以最后一行

(int)(*func)();

可以替换为

(*func)();

【讨论】:

    【解决方案2】:

    int (*func)(); 是指向返回类型为int 的函数的指针的定义,func = (int (*)()) shellcode; 将函数指针分配给shellcode[](汇编器字节码,CPU 执行的指令)的地址,(int)(*func)();由于指定了(),因此通过其地址(汇编程序指令)调用该函数,不传递任何参数。例如,汇编指令\x90 的名称为NOP(N o Op eration)并且什么都不做,其他汇编指令根据您的系统做不同的事情执行它们。

    【讨论】:

    • thnx Yasir,但是没弄好,所以 func = (int (*)()) shellcode ,它有什么作用?它会获取shellcode的地址并将其放在func中吗?并且是函数实现
    • 致问题作者:C中的每个函数都有地址,func = (int (*)()) shellcode;告诉编译器函数的代码从shellcode[]的第一个字节开始,但是你有一个函数是只是汇编代码。由于编译后的每个 C 程序都变成了汇编代码,这不是问题,调用(int)(*func)(); 应该会执行您在shellcode[] 中输入的汇编指令。
    猜你喜欢
    • 2016-12-17
    • 2012-12-28
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    相关资源
    最近更新 更多