我所遵循的教程是针对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,任何指针(没有双关语!)将不胜感激
答案 0 :(得分:5)
我认为这是因为您正在尝试访问text
部分中的数据。通常,您不能写入代码段以获得安全性。可修改的数据应位于data
部分。
此外,我绝不会建议使用call
将其后的地址推送到堆栈以获取指向其后的数据的指针的副作用。有没有解释为什么要这样做?