2014-08-28 19 views
6

Tôi mới sử dụng StackOverflow. Gần đây, tôi bắt đầu học lắp ráp và khá mới để lắp ráp, hoàn toàn mới với shellcode. Tôi đang sử dụng RadAsm để biên dịch bằng cách sử dụng MASM assembler và tôi đã thử nghiên cứu shellcode từ trang web này Shellcoding for Linux and WindowsCó sự khác biệt nào giữa shellcode MASM và mã shell NASM

Tôi đang sử dụng RadAsm trên Windows 64 bit. Mã tôi sử dụng gần như giống nhau, ngoại trừ việc tôi sử dụng tên tuyệt đối của hàm thay vì địa chỉ của hàm trong DLL. Mã shell được cho là sử dụng chức năng ngủ với tham số 5000.

Đây là mã tôi đang sử dụng trong 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 

Việc lắp ráp này không có lỗi trong MASM.

Mã shell được tạo có giá trị null và hơi khác so với trang web. Nó như sau.

Tôi đã sử dụng objdump -d nameofexecutable.exe để tháo gỡ.

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 

Nhưng trên trang web, không có mã số 00.

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 

Có thể vì tôi đang sử dụng x64 để biên dịch hoặc vì tôi đang gọi hàm gián tiếp?

Bất kỳ trợ giúp nào sẽ được đánh giá cao, cảm ơn bạn.

+0

Nó cũng có thể là do sự khác biệt phiên bản của MASM/NASM. –

Trả lời

3

Câu trả lời đơn giản là MASM hút !!

Trích dẫn từ here "Trước đây tôi đã phát triển shellcode 32 bit bằng cách sử dụng Netwide Assembler (NASM) miễn phí và mã nguồn mở, nhưng khi thực hiện việc học 64-bit, tôi đã tìm ra Một vấn đề nhanh chóng trở nên rõ ràng: MASM không cung cấp cách nào (mà tôi biết) để tạo ra mã máy nhị phân nguyên như trái ngược với tệp .exe! Tất cả không bị mất, mã byte có thể được trích xuất từ ​​tập tin .exe một cách dễ dàng đủ (nhưng trong tương lai tôi có thể quay trở lại NASM). ", nó khó khăn hơn để tạo shellcode.

Tôi đã sử dụng NASM để tạo shellcode cho chương trình nói rằng từ liên kết bạn cung cấp trên windows x64, đây là kết quả mà tôi đã đạt được, không có byte trống. Hóa ra ví dụ cho giấc ngủ có thể không hoạt động chính xác nhưng ví dụ thứ hai là đầy đủ chức năng.

"\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" 

Chú ý: sử dụng nameofexecutable.o với objdump

tức. objdump -o nameofexecutable.o để lấy shellcode và không nameofexecutable.exe

4

Mã của bạn được lắp ráp để chạy ở 0x00401000, vì vậy, byte cao nhất của tất cả các địa chỉ sẽ kết thúc bằng 0x00. Mã của chúng được lắp ráp để chạy ở 0x08048080, vì vậy byte cao nhất của tất cả các địa chỉ của chúng kết thúc bằng 0x08.

Đây là nơi tất cả các số không đến từ bạn.

+0

Tôi tìm thấy cách bạn có mã hex và nơi nó đang chạy nhưng có cách nào để sửa các giá trị NULL không? – David

+0

@David ý của bạn là "sửa"?Họ không gây ra vấn đề, đúng không? – davmac

+0

tốt, theo câu trả lời, họ đang bắt đầu tại 0x00 và họ đang gây ra các byte NULL để xảy ra như vậy làm thế nào tôi có thể loại bỏ các byte NULL? @davmac – David

Các vấn đề liên quan