NASM组装二进制工作,但C语言中的shellcode导致分段错误

时间:2015-09-02 23:56:06

标签: c assembly x86 nasm shellcode

我正在尝试学习汇编和shellcode。我有一个问题一直让我疯了几天。我已经编写了一些程序集来对execve进行系统调用。组装的文件可以工作,但是当我将它转换为shellcode并尝试从C程序运行它时,我得到了一个分段错误。我尝试了各种各样的变化,但没有任何作用。目前,nasm代码如下:

global _start

section .data
    cmd: db '/bin/netcat', 0
    argv0: db 'netcat', 0
    argv1: db '127.0.0.1', 0
    argv2: db '3333', 0
    argv: dd argv0, argv1, argv2, 0

section .text
_start:
    mov ebx, cmd ; filename parameter
    mov ecx, argv ; argv parameter
    xor edx, edx ; envp parameter
    mov al, 11 ; execve system call number. Moving to al rather than eax to prevent null bytes in shellcode.
    int 0x80

    ; exit
    xor ebx, ebx ; status code 0
    mov al, 1 ; sys_exit
    int 0x80

我用以下命令组装了这个:

nasm -f elf32 test.asm -o test.o && ld -m elf_i386 test.o -o test

运行测试工作正常。我使用this page中的命令从test中获取了shellcode,当然,用./test替换了./PROGRAM。

最后,我有以下C代码:

unsigned char[] = "\xbb\x98\x90\x04\x08\xb9\xba\x90\x04\x08\x31\xd2\xb0\x0b\xcd\x80\xb0\x01\x31\xdb\xcd\x80";

main()
{
    int (*ret)() = (int(*)())code;
    ret();
}

编译:

gcc -g -m32 -fno-stack-protector -z execstack testshellcode.c -o testshellcode

运行testshellcode会导致分段错误。我尝试了各种各样的东西,比如使代码成为const,使用不同的标志进行编译,以及大约1,000种nasm代码的变体。我已成功运行调用execve的其他shellcode,但在这些情况下argv很简单。

使用gdb,我可以看到它在调用ret()时崩溃。查看分段错误后的寄存器:

eax 0xffffffda -38
ecx 0x80490ba 134516922
edx 0x0 0
ebx 0x0 0
esp 0xbffff14c 0xbffff14c
ebp 0xbffff178 0xbffff178
eip 0x804a03a 0x804a03a <code+22>
eflags 0x10246 [ PF ZF IF RF ]

任何帮助都将受到高度赞赏。

0 个答案:

没有答案