Gcc 不使用函数指针调用外壳代码?
有没有一种方法可以在不使用函数指针的情况下获取外壳代码中函数的返回值Gcc 不使用函数指针调用外壳代码?,gcc,assembly,x86,shellcode,Gcc,Assembly,X86,Shellcode,有没有一种方法可以在不使用函数指针的情况下获取外壳代码中函数的返回值 #include <stdio.h> unsigned char code[] = "\x55\x48\x89\xe5" "\xb8\x05\x00\x00" "\x00\x5d\xc3"; int main(void) { int (*p)(void) = (int(*)(void))code
#include <stdio.h>
unsigned char code[] = "\x55\x48\x89\xe5"
"\xb8\x05\x00\x00"
"\x00\x5d\xc3";
int main(void) {
int (*p)(void) = (int(*)(void))code;
printf("%d", p());
return 0;
}
#包括
无符号字符代码[]=“\x55\x48\x89\xe5”
“\xb8\x05\x00\x00”
“\x00\x5d\xc3”;
int main(void){
int(*p)(void)=(int(*)(void))代码;
printf(“%d”,p());
返回0;
}
外壳代码(参见本演示文稿)是注入应用程序的机器代码,用于接管应用程序并在该应用程序的进程中运行您自己的应用程序
外壳代码如何注入应用程序并开始运行将取决于渗透的方式
但是,对于实际外壳代码的测试方法,与最初注入外壳代码的方法不同,测试通常使用一个简单的程序来完成,该程序允许您(1)创建要作为字节数组注入的外壳代码程序,并(2)开始执行外壳代码
最简单的方法是您发布的源代码
您有一个包含要执行的机器代码的无符号字符数组
您有一个main()
,它创建一个指向无符号字符字节数组的函数指针,然后通过函数指针调用外壳代码
然而,在现实世界中,您通常会使用一种技术,通过将外壳代码注入其进程空间,然后触发外壳代码的执行来接管应用程序。其中一种方法是缓冲区溢出攻击。例如,请参见
另见
还要注意的是,外壳代码攻击的方法会因受到攻击的操作系统而异。例如,请参阅本文,它解释了在Windows中编写用于访问系统调用的外壳代码的一些复杂性。与本文相比,本文提供了一种解决问题的方法。闻起来像是XY问题。通过函数指针调用有什么问题?没什么问题,我只是想知道是否可以使用内联汇编调用函数,并将函数的返回值写入变量,这只是我的好奇心。例如,如果我不需要获取函数返回值,我可以做类似的事情,谢谢你的回答,我已经对外壳代码有了一点了解,但我的目的是想知道是否有可能在不使用函数指针的情况下获得函数的返回值。想知道是否可以使用内联assembly@YuriAlbuquerque是的,可以使用内联程序集获取返回代码。如果这是你想知道的,那么你需要编辑你发布的问题以包含这些信息。@YuriAlbuquerque和Richard-大多数人通过在asm(如NASM或GAS)中编写外壳代码来开发外壳代码,而不是直接在机器代码中编写。他们使用汇编程序将asm源代码转换为机器代码和hexdump,或者让汇编程序生成一个十六进制列表。因此,通常您会在NASM程序中测试外壳代码作为
\u start
或main
。显然,使用调试器获取返回值很容易,或者使用strace
查看传递到exit
系统调用的值,以从main获取完整的返回值。(不仅仅是8位进程退出状态。)