我目前正在阅读一本关于外壳编码的书,在其中一个例子中我遇到了一些问题。我正在尝试编译下面的代码,但我一直收到关于流浪"\“的错误。有没有因为"\“而必须输入字符的特定方式?
// 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;
}发布于 2016-08-24 16:06:56
\x表示十六进制字符转义。来自C99 6.4.4.4。
十六进制转义序列中反斜杠和字母x后面的十六进制数字被视为整数字符常量的单个字符或宽字符常量的单个宽字符的构造的一部分。
示例3即使具有char类型的对象使用了8位,结构'\x123‘也指定了一个仅包含一个字符的整数字符常量,因为十六进制转义序列仅以非十六进制字符结尾。要指定包含值为'\x12‘和'3’的两个字符的整数字符常量,可以使用结构'\0223‘,因为八进制转义序列在三个八进制数字之后终止。(此双字符整数字符常量的值由实现定义。)
发布于 2016-08-24 16:12:06
我认为这个问题是由排版引用引起的:“ ”。
在C中,字符串必须用正则双引号括起来:"
十六进制字符的\x表示法仅适用于字符串(双引号)和字符常量(单qoute)。由于排版问题,编译器不会将代码识别为字符串。
因此,尝试像这样更改声明:
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";发布于 2016-08-24 16:17:28
如前所述,您的报价在这里是一个问题。将它们粘贴到vi上会产生?~@~\\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;
}https://stackoverflow.com/questions/39117386
复制相似问题