2014-08-28 1 views
6

저는 StackOverflow를 처음 사용합니다. 최근에 저는 어셈블리를 연구하기 시작했고 어셈블리에 상당히 새롭습니다. 완전히 쉘 코드에 익숙하지 않았습니다. RadAsm을 사용하여 MASM 어셈블러를 사용하여 컴파일 중이며이 웹 사이트에서 쉘 코드를 시험해 보았습니다. Shellcoding for Linux and WindowsMASM 쉘 코드와 NASM 쉘 코드 사이에 차이가 있습니까?

Windows 64 비트에서 RadAsm을 사용하고 있습니다. 내가 사용한 코드는 DLL의 함수 주소가 아닌 함수의 절대 이름을 사용한다는 점을 제외하면 거의 동일합니다. 쉘 코드는 매개 변수 5000과 함께 sleep 함수를 사용해야합니다.

이것은 MASM에서 사용하는 코드입니다.

.386 
.model flat, stdcall 
option casemap:none 

include kernel32.inc 
includelib kernel32.lib 

.code 
_start: 
    xor eax, eax ; zero out eax 
    mov ebx, Sleep ; function sleep goes in ebx 
    mov ax, 5000 ; parameter goes in ax 
    push eax  ; parameter on stack 
    call ebx  ; call Sleep 
end _start 
end 

이 어셈블리는 MASM에서 오류없이 어셈블됩니다.

생성 된 쉘 코드는 null 값을 가지고 있으며 웹 사이트와 약간 다릅니다. 그것은 다음과 같습니다.

해체를 위해 objdump -d nameofexecutable.exe을 사용했습니다.

Disassembly of section .text 
00401000 <.text>: 
    401000:  33 c0     xor %eax,%eax 
    401002:  bb 0e 10 40 00   mov $0x40100e,% 
    401007:  66 b8 88 13    mov $0x1388,%ax 
    40100b:  50      push %eax 
    40100c:  ff d3     call *%ebx 
    40100e:  ff 25 00 20 40 00  jmp *0x402000 

그러나 웹 사이트에는 00 16 진수 코드가 없습니다.

Disassembly of section .text: 

08048080 <_start>: 
8048080:  31 c0     xor %eax,%eax 
8048082:  bb ea 1b e6 77   mov $0x77e61bea,%ebx 
8048087:  66 b8 88 13    mov $0x1388,%ax 
804808b:  50      push %eax 
804808c:  ff d3     call *%ebx 

컴파일 할 때 x64를 사용하고 있거나 간접적으로 함수를 호출했기 때문에 그럴 수 있습니까?

도움을 주시면 감사하겠습니다. 감사합니다.

+0

또한 MASM/NASM의 버전 차이가 원인 일 수 있습니다. –

답변

3

간단한 대답은 MASM이 짜증이났다는 것입니다.

인용구 : here "이전에는 자유롭고 오픈 소스 인 Netwide Assembler (NASM)를 사용하여 32 비트 쉘 코드를 개발했지만, 64 비트 버전을 배우는 연습을 할 때마다 시도해 보았습니다. MASM은 .exe 파일과는 달리 원시 이진 컴퓨터 코드를 생성 할 수있는 방법이 없습니다 (모두 알고 있습니다). 코드 바이트는 모두 손실되지 않습니다. .exe 파일에서 쉽게 추출 할 수 있습니다 (그러나 나중에 NASM으로 돌아갈 수도 있습니다). ", 쉘 코드를 작성하는 것이 더 어렵습니다.

저는 NASM을 사용하여 Windows x64에서 제공 한 링크에서 hey라고 쓰여진 프로그램의 쉘 코드를 작성했습니다. 이것은 내가 얻은 결과이며 null 바이트가 아닙니다. 잠자기 예제가 제대로 작동하지 않을 수 있지만 두 번째 예는 완전히 작동합니다.

"\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xeb\x2f\x59\x88\x51\x0a" 
"\xbb\x82\xf8\x60\x77\x51\xff\xd3\xeb\x31\x59\x31\xd2" 
"\x88\x51\x0b\x51\x50\xbb\xe6\x4d\x61\x77\x59\x31\xd2" 
"\x88\x51\x03\x31\xd2\x52\x51\x51\x52\x31\x32\xd2\x50" 
"\xb8\xca\x3a\x61\x77\xe8\xcc\xff\xff\xff\x75\x73\x65" 
"\x72\x33\x32\x2e\x64\x6c\x6c\x4e\xe8\xca\xff\xff\xff" 
"\x4d\x65\x73\x73\x61\x67\x65\x42\x6f\x78\x41\x4e\xe8" 
"\xc6\xff\xff\xff\x48\x65\x79\x4e" 

참고 : objdump를

예와 nameofexecutable.o 사용합니다. objdump -o nameofexecutable.o는 nameofexecutable.exe가 아닌 shellcode를 얻습니다.

4

코드는 0x00401000에서 실행되도록 어셈블 링되므로 모든 주소의 가장 높은 바이트가 0x00이됩니다. 그들의 코드는 0x08048080에서 실행되도록 어셈블되며, 따라서 모든 주소의 가장 높은 바이트는 0x08이됩니다.

여기에 모두 0이옵니다.

+0

어떻게 16 진수 코드를 얻었는지와 그것이 실행되고 있지만 NULL 값을 고칠 수있는 방법이 있습니까? – David

+0

@David "수정"이란 무엇입니까?그들은 문제를 일으키고 있지 않습니까? – davmac

+0

글쎄, 대답에 따르면, 그들은 0x00에서 시작하고 그들은 NULL 바이트를 일으키는 원인이되고 그래서 내가 어떻게 NULL 바이트를 제거 할 수 있습니까? @davmac – David