2014-02-17 1 views
0
_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-전화 팝)을 쓰기 위해 노력하고있어

답변

2

movsdesi이 가리키는 메모리에서 edi이 가리키는 메모리로 4 바이트를 이동합니다. edi을 초기화하지 않았으므로이 주소는 임의의 주소에 저장됩니다. 그것은 segfault가 일어나는 것이 대단히 놀랍지 않습니다.

인텔의 아키텍처 설명서, 볼륨 2 (이들은 무료로 다운로드하고 당신의 기본적인 조립의 모든 질문에 답을 다운로드하고 당신이 어셈블리를 작성하는 거라면 것들을 찾을 수있는 곳을 익힐 수 있습니다.) :

두 번째 피연산자 (소스 피연산자)으로 지정된 바이트, 워드 또는 더블 워드를 첫 번째 피연산자 (대상 피연산자)으로 지정된 위치로 이동합니다. 원본 및 대상 피연산자 모두 메모리에있는 입니다.

+0

lea edi, [edx]'segfault! 하지만 edx 주소로 edi를 초기화하고 있습니다 ... 맞습니까? – polslinux

+0

"edx의 주소"와 같은 것이 없습니다. 'lea edi, [edx]는'mov edi, edx '와 동일합니다.'edx'도 초기화되지 않았기 때문에 도움이되지 않습니다. x86 어셈블리의 기본 사항에 익숙해 지려면 시간을 할애해야합니다. –

+0

내가 맞는지 말해주세요. 문자열의 4 바이트를 직접 레지스터에 저장할 수 없습니까? .bss 섹션 안에 버퍼를 사용해야합니다 ... 그렇지 않은가요? – polslinux

관련 문제