我目前正在阅读一本关于shellcoding的书,我在其中一个例子中遇到了一些问题。我正在尝试编译下面的代码,但我一直收到关于流浪“\”的错误。是否有某种方式我必须输入字符因为“\”?
// 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 :(得分:0)
\ x表示十六进制字符转义。来自C99 6.4.4.4。:
反斜杠后面的十六进制数字和十六进制转义序列中的字母x被视为构造整数字符常量的单个字符或宽字符常量的单个宽字符的一部分。
示例3即使对于具有char类型的对象使用8位,构造'\ x123'也指定仅包含一个字符的整数字符常量,因为十六进制转义序列仅由非十六进制字符终止。要指定包含值为'\ x12'和'3'的两个字符的整数字符常量,可以使用构造'\ 0223',因为八进制转义序列在三个八进制数字后终止。 (这个双字符整数字符常量的值是实现定义的。)
答案 1 :(得分:0)
我认为问题是由排版引号引起的:“
”
。
在C中,字符串必须用常规双引号括起来:"
十六进制字符的\x
表示法仅适用于字符串(双引号)和字符常量(单个qoutes)。由于排版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";
答案 2 :(得分:0)
如前所述,您的报价是一个问题。将它们粘贴在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;
}