编译C代码中的ShellCode程序

问题描述:

我目前正在阅读关于shellcoding的一本书,并在其中一个示例中遇到了一些问题。我试图编译下面的代码,但我不断收到有关流浪“\”的错误。是否有某种方式需要输入字符,因为“\”?编译C代码中的ShellCode程序

// shellcode.c 

char shellcode[] = 
“\xeb\x1a\x5e\x31\xc0\x88\x46\x07\x8d\x1e\x89\x5e\x08\x89\x46” 
“\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe1” 
“\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68”; 

int main(){ 

    int *ret; 
    ret = (int *)&ret + 2; 
    (*ret) = (int)shellcode; 
} 
+0

'\ x'产生转义的'x'字符。 –

\ x指示十六进制字符转义。从C99开始6.4.4.4 .:

十六进制转义序列中反斜杠和字母x后面的十六进制数字被视为构造整数字符常量或单个字符的单个字符的一部分宽字符为宽字符常量。示例3即使八位用于char类型的对象,构造'\ x123'也指定一个只包含一个字符的整数字符常量,因为十六进制转义序列仅由非十六进制字符终止。要指定包含两个字符的值为'\ x12'和'3'的整数字符常量,可以使用构造'\ 0223',因为八进制转义序列在三个八进制数字后终止。 (这两个字符的整型字符常量的值是实现定义的。)

我认为这个问题是由排版引号引起:

在C语言中,字符串必须以普通双引号括起来:"

\x符号为十六进制字符只能内部字符串(双引号)和字符常量(单qoutes)。印刷品编码的原因是编译器无法将代码识别为字符串。

所以尝试改变这样的声明:

char shellcode[] = 
"\xeb\x1a\x5e\x31\xc0\x88\x46\x07\x8d\x1e\x89\x5e\x08\x89\x46" 
"\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe1" 
"\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68"; 
+0

谢谢你们的帮助。我刚刚意识到,也许是因为我粘贴了代码,它没有立即将它读作字符串。一个我删除了引号并重新键入它们,然后文本变成黄色(纳米)来表示一个字符串并将其编译。 – Tarrell13

如前所示,你的报价是一个问题在这里。在vi上粘贴它们会产生[email protected]~\\xeb..,这可能解释了对反斜杠的抱怨。

此外,我会考虑这个shellcode的演员,这是更直接。

char shellcode[] = 
"\xeb\x1a\x5e\x31\xc0\x88\x46\x07\x8d\x1e\x89\x5e\x08\x89\x46" 
"\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe1" 
"\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68"; 

int main(){ 
     (*(void(*)()) shellcode)(); 
    return 0; 
} 
+0

好吧,我只是复制和粘贴你有什么,我很困惑。不是很困惑,但有点。这是一个被调用的函数吗?也许这是令人困惑的,因为它都在一条线上。在编程方面,我仍然是新手,但我正在努力工作。 – Tarrell13

+0

那么shellcode是一段代码,它最终会调用'exec'系统调用系列。因此,从C的角度来看,这就像一个函数调用。特别是,这个函数将是'noreturn'。所以我觉得这个表演更明显。有关信息,我不是发明这个演员的人。 – Aif