2014-12-22 2 views
0

쉘을 생성하기 위해 ASM 코드를 작성하려고합니다."/ bin/sh"을 레지스터에로드하십시오.

나는 __execve에 대한 콜 번호가 0x3b 것을 알아 낸 것 또는 59

나는 세 번째 매개 변수로 두 번째 매개 변수 및 NULL{"/bin/sh", NULL}에, 첫 번째 매개 변수로 포인터를 "/bin/sh"을 보내야합니다. 인텔 아키텍처 x86_64에의 ASM의 convetions 바이

- 첫 번째 파라미터는 RDI 레지스터에 기록되고, 두 번째 파라미터는 RSI 레지스터에 기록되고, 최종 파라미터는 RDX 레지스터에 기입된다. 내가 코드를 컴파일하고 링크하려면 다음 지침을 사용

global _start 

section .text 

_start: 

jmp message 

mystart: 
    xor  rax, rax 
    push rax 
    push rax 
    pop  rdx  ; third parameter - NULL 
    pop  rdi  ; first parameter - "/bin/sh" 
    mov  rax, rdi  
    push rax 
    push rsp 
    pop  rsi  ; second parameter - pointer to {"/bin/sh", NULL} 
    xor  rax, rax 
    mov  al, 0x3b 
    syscall 


    xor rax, rax 
    mov al, 0x3c 
    xor rdi, rdi 
    mov dil, 0x0a 
    syscall 

message: 

    call mystart 
    db "/bin/sh" 

section .data 

:

내 코드입니다.

Dump of assembler code for function _start: 
0x0000000000400080 <+0>: jmp 0x4000a3 <_start+35> 
0x0000000000400082 <+2>: xor rax,rax 
0x0000000000400085 <+5>: push rax 
0x0000000000400086 <+6>: push rax 
0x0000000000400087 <+7>: pop rdx 
0x0000000000400088 <+8>: pop rdi 
0x0000000000400089 <+9>: mov rax,rdi 
0x000000000040008c <+12>: push rax 
0x000000000040008d <+13>: push rsp 
0x000000000040008e <+14>: pop rsi 
0x000000000040008f <+15>: xor rax,rax 
0x0000000000400092 <+18>: mov al,0x3b 
0x0000000000400094 <+20>: syscall 
0x0000000000400096 <+22>: xor rax,rax 
0x0000000000400099 <+25>: mov al,0x3c 
0x000000000040009b <+27>: xor rdi,rdi 
0x000000000040009e <+30>: mov dil,0xa 
---Type <return> to continue, or q <return> to quit--- 
0x00000000004000a1 <+33>: syscall 
0x00000000004000a3 <+35>: call 0x400082 <_start+2> 
0x00000000004000a8 <+40>: pop rsp 
0x00000000004000a9 <+41>: (bad) 
0x00000000004000aa <+42>: (bad) 
0x00000000004000ab <+43>: .byte 0x69 
0x00000000004000ac <+44>: outs dx,BYTE PTR ds:[rsi] 
0x00000000004000ad <+45>: pop rsp 
0x00000000004000ae <+46>: (bad) 
0x00000000004000af <+47>: jae 0x400119 

당신이 (bad) 지침 db "/bin/sh"에 의해 발생 볼 수 있듯이,이 문자열이 잘못 무엇을 다음과 같이

yasm -f elf64 shell.asm -o shell.o 
ld -o shell.out shell.o 

_start 함수의 GDB 덤프는? (bad) 교육이란 무엇입니까? 어떻게 이러한 문제를 나중에 디버깅합니까?

+2

문자열에 아무런 문제가 없습니다. 이 바이트는 유효한 asm opcode에 매핑되지 않습니다. 따라서 디버거가 문자열을 코드로 해석하려고하면 "bad"라고합니다. –

+0

@DavidWohlferd - 같은 방법으로 'Hello, World!'프로그램을 만들 때 이런 일이 발생하지 않았습니다. –

답변

2

① 레지스터에 문자열을로드 할 수는 없으며 문자열에 대한 포인터 만로드 할 수 있습니다.

② 스택 마법은 단순히 잘못되었습니다. 두 배로 된 push rax 중 하나를 pop rdi 바로 아래로 이동하면이 프로그램이 저에게 효과적입니다.