首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用C错误编译ShellCode程序

用C错误编译ShellCode程序
EN

Stack Overflow用户
提问于 2016-08-24 15:49:45
回答 3查看 129关注 0票数 0

我目前正在阅读一本关于外壳编码的书,在其中一个例子中我遇到了一些问题。我正在尝试编译下面的代码,但我一直收到关于流浪"\“的错误。有没有因为"\“而必须输入字符的特定方式?

代码语言:javascript
复制
// 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;
}
EN

回答 3

Stack Overflow用户

发布于 2016-08-24 16:06:56

\x表示十六进制字符转义。来自C99 6.4.4.4。

十六进制转义序列中反斜杠和字母x后面的十六进制数字被视为整数字符常量的单个字符或宽字符常量的单个宽字符的构造的一部分。

示例3即使具有char类型的对象使用了8位,结构'\x123‘也指定了一个仅包含一个字符的整数字符常量,因为十六进制转义序列仅以非十六进制字符结尾。要指定包含值为'\x12‘和'3’的两个字符的整数字符常量,可以使用结构'\0223‘,因为八进制转义序列在三个八进制数字之后终止。(此双字符整数字符常量的值由实现定义。)

票数 0
EN

Stack Overflow用户

发布于 2016-08-24 16:12:06

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

在C中,字符串必须用正则双引号括起来:"

十六进制字符的\x表示法仅适用于字符串(双引号)和字符常量(单qoute)。由于排版问题,编译器不会将代码识别为字符串。

因此,尝试像这样更改声明:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-08-24 16:17:28

如前所述,您的报价在这里是一个问题。将它们粘贴到vi上会产生?~@~\\xeb..,这可能解释了对反斜杠的抱怨。

此外,我会考虑将此类型转换用于shellcode,它更简单。

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39117386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档