| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1045 人关注过本帖
标题:把"Hello, World\n"转为机器码shellcode 来显示,执行却是Segmentation fau ...
取消只看楼主 加入收藏
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
结帖率:98.63%
收藏
已结贴  问题点数:20 回复次数:1 
把"Hello, World\n"转为机器码shellcode 来显示,执行却是Segmentation fault(已解决)
(得人指点 把char shellcode[] 变为 const unsigned char shellcode[] 就可以了
或不变shellcode,直接接 gcc -z execstack .....................就可以人)

我想把字符串转变为shellcode显示出来,可是却有问题了

首先下面是我的hello.s文件来显示"Hello, World\n"

下面的代码是AT&T的语法,不是Intel的,所以用的是as编译器, 

而不是 nasm

这个文件可以正常的把"Hello, World\n" 打印出来(问题不在这里)
程序代码:
.global _start
_start:
    jmp    do_call
jump_back:
    xor %eax, %eax
    xor %ebx, %ebx
    xor %ecx, %ecx
    xor %edx, %edx
    movb $4, %al
    movb $14, %dl
    popl %ecx
    movb $1, %bl
    int    $0x80

    xor %eax, %eax
    movb $1, %al
    xor %ebx, %ebx
    int $0x80

do_call:
    call    jump_back
hello:
    .ascii "Hello, World!\n"

然后用as编译,

$ as hello.s -o hello.o

$ ld hello.o -o hello

然后用objdump得到机器码

$ objdump -d hello
程序代码:
08048054 <_start>:

 8048054:    eb 19                    jmp    804806f <do_call>

08048056 <jump_back>:

 8048056:    31 c0                    xor    %eax,%eax

 8048058:    31 db                    xor    %ebx,%ebx

 804805a:    31 c9                    xor    %ecx,%ecx

 804805c:    31 d2                    xor    %edx,%edx

 804805e:    b0 04                    mov    $0x4,%al

 8048060:    b2 0e                    mov    $0xe,%dl

 8048062:    59                           pop    %ecx

 8048063:    b3 01                    mov    $0x1,%bl

 8048065:    cd 80                    int    $0x80

 8048067:    31 c0                    xor    %eax,%eax

 8048069:    b0 01                    mov    $0x1,%al

 804806b:    31 db                    xor    %ebx,%ebx

 804806d:    cd 80                    int    $0x80

0804806f <do_call>:

 804806f:            e8 e2 ff ff ff           call   8048056 <jump_back>

08048074 <hello>:

 8048074:    48                       dec    %eax

 8048075:    65                       gs

 8048076:    6c                       insb   (%dx),%es:(%edi)

 8048077:    6c                       insb   (%dx),%es:(%edi)

 8048078:    6f                       outsl  %ds:(%esi),(%dx)

 8048079:    2c 20                    sub    $0x20,%al

 804807b:    57                       push   %edi

 804807c:    6f                       outsl  %ds:(%esi),(%dx)

 804807d:    72 6c                    jb     80480eb <hello+0x77>

 804807f:    64 21 0a                 and    %ecx,%fs:(%edx)



然后我把机器码串写来,写入文件hello_test.c
程序代码:
#include <stdlib.h>
char shellcode[] = "\xeb\x19\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xb0\x04"\
                    "\xb2\x0e\x59\xb3\x01\xcd\x80\x31\xc0\xb0\x01"\
                    "\x31\xdb\xcd\x80\xe8\xe2\xff\xff\xff"\
                    "\x48\x65\x6c\x6c\x6f\x2c\x20\x57\x6f\x72\x6c"\
                    "\x64\x21\x0a";
int main(int argc, char **argv) {
    int (*ret)();
    ret = (int(*)())shellcode;
    (int)(*ret)();
    exit(0);
}


然后编译
$ gcc -g hello_test.c -o hello_test
$ ./hello_test
Segmentation fault

怎么会出现这个错误啊

于是我看了一下

$ strace ./hello_test
(...)
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
+++ killed by SIGSEGV +++
Segmentation fault

我实在不明白为什么会这样

于是我关掉了gcc 的stack保护,再编译
$ gcc -fno-stack-protector hello_test.c -o hello_test
$ ./hello_test
Segmentation fault

还是不行,晕了啊
有没有可以指点明路的高人

[ 本帖最后由 madfrogme 于 2012-7-10 09:26 编辑 ]
搜索更多相关主题的帖子: 编译器 字符串 Intel 
2012-07-08 16:01
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
收藏
得分:0 
回复 2楼 zklhp
版主说的有道理,我也才入门,各种不明白,继续在网上找!

The quieter you become, the more you can hear
2012-07-08 19:02
快速回复:把"Hello, World\n"转为机器码shellcode 来显示,执行却是Segmentatio ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.034174 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved