装配程序中的分段错误

时间:2012-02-14 14:18:50

标签: shell assembly segmentation-fault

我正在尝试使用以下代码生成shell:

Section .Text
        global _start

_start:
        jmp short TrickCall

_ReturnHere:
        pop             esi
        xor             eax,eax
        mov byte        [esi+7],al
        lea             ebx,[esi]
        mov long        [esi+8],ebx
        mov long        [esi+12],eax
        mov byte        al,0x0b
        mov             ebx,esi
        lea             ecx,[esi+8]
        lea             edx,[esi+12]
        int             0x80

TrickCall:
        call _ReturnHere
        db "/bin/shJAAAANNNN"

我使用gcc版本4.4.3作为我的编译器。当我使用gdb运行它时,它提供以下输出:

(gdb) run
Starting program: /root/spawn_shell 

Program received signal SIGSEGV, Segmentation fault.
0x08048059 in _ReturnHere ()

无法访问_ReturnHere的内存地址。有办法解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

你的问题是DEP,当你从堆栈中弹出返回地址并尝试写入它时,它没有被标记为可写,只有可读&可执行文件。您需要禁用DEP(错误,它意味着防止执行此类操作的漏洞利用)或将文本放在call _ReturnHere之后放入RW(X)内存。