x86_64汇编 - 在x64汇编中尝试编辑数组中的字节时的Segfault

时间:2017-07-10 06:27:21

标签: assembly segmentation-fault x86-64

我所遵循的教程是针对x86的,并且是使用32位程序集编写的,我试图在学习x64程序集的过程中继续学习。在本课程中我已经进行了很好的练习,我有以下简单的程序,它只是尝试修改字符串中的单个字符;它在运行时编译好但是段错误。

mov [rsi], al; Why segfault?

这个罪魁祸首就是这句话:

global _start


_start:
        jmp short ender

        starter:

        pop ebx                 ;get the address of the string
        xor eax, eax

        mov al, 0x20
        mov [ebx+7], al        ;put a NULL where the N is in the string

        mov al, 4       ;syscall write
        mov bl, 1       ;stdout is 1
        pop ecx         ;get the address of the string from the stack
        mov dl, 25       ;length of the string
        int 0x80

        xor eax, eax
        mov al, 1       ;exit the shellcode
        xor ebx,ebx
        int 0x80

        ender:
        call starter
        db 'AAAABBBNAAAAAAAABBBBBBBB'0x0A

如果我发表评论,那么程序运行正常,输出消息' AAAABBBNAAAAAAAABBBBBBB'为什么我不能修改字符串?

作者代码如下:

nasm -f elf <infile> -o <outfile>
ld -m elf_i386 <infile> -o <outfile>

我使用以下方法编译了这些:

$query = Doctrine_Query::create()
        ->select('*')
        ->from('attendanceRecord a')
        ->where("employeeId IN (?)", implode(",", $employeeId));

但即使这会导致段错误,页面上的图像显示它正常工作并将N更改为空间,但是我似乎陷入了段落之地:(谷歌在这种情况下并没有帮助,所以我转向你stackoverflow,任何指针(没有双关语!)将不胜感激

1 个答案:

答案 0 :(得分:5)

我认为这是因为您正在尝试访问text部分中的数据。通常,您不能写入代码段以获得安全性。可修改的数据应位于data部分。

此外,我绝不会建议使用call将其后的地址推送到堆栈以获取指向其后的数据的指针的副作用。有没有解释为什么要这样做?