_start:
jmp short call
shell:
pop esi
movsd ;move 4 byte from esi to edi (/bin)
mov edx,edi ;edx contains /bin
xor edi,edi
movsw ;move 2 bytes (/s)
xor ebx,ebx
mov ebx,edi ;ebx contains /s
xor eax,eax
xor edi,edi
movsb
mov eax,edi ;eax contiene h
mov esi,edx ;esi contains /bin
xor ecx,ecx
push ecx
mov edx,esp ;edx dword NULL
push ecx ;NULL
push ecx ;NULL
add esp,3 ;0
push eax
add esp,3 ;h
push ebx
add esp,2 ;/s
push esi ;/bin
mov ecx,esp ;/bin/sh0,NULL
xor edi,edi
push edi
add esp,3 ;0
push eax
add esp,3
push ebx
add esp,2
push esi
mov ebx,esp ;/bin/bash0
xor eax,eax
mov al,0xb
int 0x80
call:
call shell
path db "/bin/sh"
我正在尝试编写一个shellcode(jmp-call-pop)来生成一个shell,但我在movsd
指令(segfault)上遇到了问题。我不明白有什么问题,我设置esi与ptr到字符串所以movsd应该从esi移动4个字节到edi对吗?但为什么它是segfaulting?
答案 0 :(得分:2)
movsd
将esi
指向的内存中的4个字节移动到edi
指向的内存。您尚未初始化edi
,因此这是一个存储到任意地址;它发生在段错误中并不奇怪。
英特尔架构手册,第2卷(这些是免费下载的,可以回答所有基本的汇编问题。如果您要编写汇编,请下载并熟悉查找内容的位置):
移动用第二个操作数指定的字节,字或双字 (源操作数)到第一个操作数指定的位置 (目的地操作数)。 源操作数和目标操作数都是 位于记忆中。