_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"
세그 폴트 movsd하지만 난 movsd
명령 (는 segfault)에 문제가있어. 나는 무엇이 잘못되었는지 이해하지 못한다. 그래서 esi를 문자열에 ptr로 설정하면 movsd가 esi에서 edi로 4 바이트 이동해야한다. 그러나 왜 그것이 segfaulting입니까?86 어셈블리는, 내가 쉘을 산란 쉘 코드 (JMP-전화 팝)을 쓰기 위해 노력하고있어
lea edi, [edx]'segfault! 하지만 edx 주소로 edi를 초기화하고 있습니다 ... 맞습니까? – polslinux
"edx의 주소"와 같은 것이 없습니다. 'lea edi, [edx]는'mov edi, edx '와 동일합니다.'edx'도 초기화되지 않았기 때문에 도움이되지 않습니다. x86 어셈블리의 기본 사항에 익숙해 지려면 시간을 할애해야합니다. –
내가 맞는지 말해주세요. 문자열의 4 바이트를 직접 레지스터에 저장할 수 없습니까? .bss 섹션 안에 버퍼를 사용해야합니다 ... 그렇지 않은가요? – polslinux