2017-04-12 8 views
0

조립품에 코드를 작성하지 않고 쉘 코드를 만들 수 있습니까? ,조립하지 않고 쉘 코드 구성

(gdb) x/15i main 
    0x400506 <main>:  push %rbp 
    0x400507 <main+1>: mov %rsp,%rbp 
=> 0x40050a <main+4>: sub $0x20,%rsp 
    0x40050e <main+8>: mov %edi,-0x14(%rbp) 
    0x400511 <main+11>: mov %rsi,-0x20(%rbp) 
    0x400515 <main+15>: movq $0x4005d4,-0x10(%rbp) 
    0x40051d <main+23>: movq $0x0,-0x8(%rbp) 
    0x400525 <main+31>: lea -0x10(%rbp),%rax 
    0x400529 <main+35>: mov $0x0,%edx 
    0x40052e <main+40>: mov %rax,%rsi 
    0x400531 <main+43>: mov $0x4005de,%edi 
    0x400536 <main+48>: callq 0x4003f0 <[email protected]> 
    0x40053b <main+53>: mov $0x0,%eax 
    0x400540 <main+58>: leaveq 
    0x400541 <main+59>: retq 

불행하게도 나는이 쉘 코드를 생성하는 데 사용할 수 없습니다 다음 얻을

#include <stdlib.h> 

int main(int argc, char** argv) 
{ 
     char* args[] = { "/bin/bash", NULL }; 
     execve("bin/bash", &args, NULL); 
     return 0; 
} 

그럼 난 그것을 컴파일하고 gdb를 사용 :

나는 다음과 같은 간단한 응용 프로그램을 컴파일하려고 전역 옵셋 테이블 [main + 48]을 사용하기 때문에.

어셈블리로 돌아 가지 않고 쉘 코드를 생성하려면 어떻게해야합니까?

+0

쉘 코드로 직접 사용될 수 있습니다. – fuz

답변

1

수 없습니다.

C 컴파일러는 시스템 호출을 직접 생성하는 방법을 알지 못합니다. 호출하는 방법은 GOT를 사용하는 함수를 호출하는 것입니다.

(당신은 인라인 어셈블러를 사용하여이 문제를 해결할 수 있지만 여전히 당신이 피하고 싶은 말한 "어셈블리 코드를 작성하는".의) 그 너머

, 당신은 또한 찾을거야 C 컴파일러는 우발적으로 null 바이트를 포함하는 어셈블리를 생성합니다. 이것은 많은 응용 프로그램에서 작동하지 않습니다.

어셈블리를 작성하는 방법이나 다른 사람의 쉘 코드를 사용하는 방법을 익히십시오.

0

다음은/bin/sh 및 stack 메소드를 사용하여 execve로 쉘을 여는 예제입니다.

현재 Security Tube의 Linux Assembly 64 비트 교과 과정과 해킹, The Art of Exploitation, Jon Erickson을 읽고 있습니다. x86 어셈블리를 사용합니다.

; David @InfinitelyManic 
; execute_shellcode_stack.s 
; nasm -felf64 -g -F dwarf execute_shellcode_stack.s -o execute_shellcode_stack.o && ld execute_shellcode_stack.o -o execute_shellcode_stack 
; code from course: http://www.securitytube-training.com/online-courses/x8664-assembly-and-shellcoding-on-linux/ 
; 
section .bss 
section .data 
section .text 
     global _start 
_start: 
     ; <syscall name="execve" number="59"/> 
     ; int execve(const char *filename, char *const argv[], char *const envp[]); 
     ; x86_64     rdi     rsi     rdx  r10 r8 r9 

     xor rax, rax       ; null 
     push rax        ; push 0x00 

     ; we need /bin//sh in hex in reverse 
     ; rev <<< "/bin//sh" | xxd -g4 
     ; 00000000: 68732f2f 6e69622f 0a     hs//nib/. 

     mov rbx, 0x68732f2f6e69622f  ; hs//nib/ ascii 

     push rbx      ; push '/bin//sh' to stack 

     mov rdi, rsp     ; _filename = '/bin//sh'0000 

     push rax      ; second null 0x00 "" 

     mov rdx, rsp     ; envp = array of strings == null 

     push rdi      ; push _filename 

     mov rsi, rsp     ; argv = array of argument strings = _filename 

     add rax, 59      ; syscall # for execve 

     syscall 

objdump를 :

execute_shellcode_stack:  file format elf64-x86-64 


Disassembly of section .text: 

0000000000400080 <_start>: 
    400080:  48 31 c0    xor rax,rax 
    400083:  50      push rax 
    400084:  48 bb 2f 62 69 6e 2f movabs rbx,0x68732f2f6e69622f 
    40008b:  2f 73 68 
    40008e:  53      push rbx 
    40008f:  48 89 e7    mov rdi,rsp 
    400092:  50      push rax 
    400093:  48 89 e2    mov rdx,rsp 
    400096:  57      push rdi 
    400097:  48 89 e6    mov rsi,rsp 
    40009a:  48 83 c0 3b    add rax,0x3b 
    40009e:  0f 05     syscall 

는 C 음식물에 대한 쉘 코드를 생성합니다

$ for i in $(objdump -d execute_shellcode_stack | grep "^ " |cut -f2); do echo -n "\x"$i; done; echo 
\x48\x31\xc0\x50\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x53\x48\x89\xe7\x50\x48\x89\xe2\x57\x48\x89\xe6\x48\x83\xc0\x3b\x0f\x05 

출력 : 난 당신이 코드를 생성하는 컴파일러를 얻을 수 있다고 생각하지 않습니다

$ ./shellcode 
Shellcode Length: 32 
$ 
+0

어쩌면 당신이 그것을 놓쳤을 수도 있지만 질문은 "_ 어셈블리에 코드를 작성하지 않고 쉘 코드를 만들 수 있습니까?"라고 물었습니다. 어셈블리 언어 만 사용합니다. –

+0

예, 저는 그 질문을 알고 있었고 제 대답은 모든 네 발에 해당하지 않았습니다. OP와 다른 사람들은 대답을 허용하지 않거나 그것을 표시하지 않도록 선택할 수 있습니다. "어셈블리를 작성하는 방법을 배우거나 다른 사람의 쉘 코드를 사용하는 방법을 배우십시오"라는 문맥에서 도움을 주기만하면됩니다. – InfinitelyManic