如何将具有extern函数的程序集转换为osx 64中的shellcode intel

问题描述:

我想将此程序集转换为shellcode。如何将具有extern函数的程序集转换为osx 64中的shellcode intel

这个程序只是创建了一个文件,我的目的是我应该如何转换组件,我使用的extern命令时,它

我ASSMBLY代码是的shellcode:

extern _fopen,_fclose 

global main 
section .text 

main: 

    xor r10,r10 

    push r10 
    mov r13, 0x6277 
    push r13 
    mov  rsi,rsp 

    push r10 
    mov r13, 0x726964656b616d 
    push r13 
    mov  rdi,rsp 

    call _fopen 
     mov  r14, rax 


    mov  rdi, r14 
    call _fclose 

    mov  rax, 0x2000001 ; exit 
    mov  rdi, 0 
    syscall 

我用这个命令编译它:

nasm -f macho64 test2.asm 
ld -o test -e main test2.o -lSystem 

,我用objdum -d测试创建的shellcode

...........$ objdump -d test 

test:  file format mach-o-x86-64 


Disassembly of section .text: 

0000000000001f93 <main>: 
    1f93: 4d 31 d2    xor %r10,%r10 
    1f96: 41 52     push %r10 
    1f98: 41 bd 77 62 00 00  mov $0x6277,%r13d 
    1f9e: 41 55     push %r13 
    1fa0: 48 89 e6    mov %rsp,%rsi 
    1fa3: 41 52     push %r10 
    1fa5: 49 bd 6d 61 6b 65 64 movabs $0x726964656b616d,%r13 
    1fac: 69 72 00 
    1faf: 41 55     push %r13 
    1fb1: 48 89 e7    mov %rsp,%rdi 
    1fb4: e8 1d 00 00 00   callq 1fd6 <_fopen$stub> 
    1fb9: 49 89 c6    mov %rax,%r14 
    1fbc: 4c 89 f7    mov %r14,%rdi 
    1fbf: e8 0c 00 00 00   callq 1fd0 <_fclose$stub> 
    1fc4: b8 01 00 00 02   mov $0x2000001,%eax 
    1fc9: bf 00 00 00 00   mov $0x0,%edi 
    1fce: 0f 05     syscall 

Disassembly of section __TEXT.__stubs: 

0000000000001fd0 <_fclose$stub>: 
    1fd0: ff 25 3a 00 00 00  jmpq *0x3a(%rip)  # 2010 <_fclose$stub> 

0000000000001fd6 <_fopen$stub>: 
    1fd6: ff 25 3c 00 00 00  jmpq *0x3c(%rip)  # 2018 <_fopen$stub> 

Disassembly of section __TEXT.__stub_helper: 

0000000000001fdc <__TEXT.__stub_helper>: 
    1fdc: 68 00 00 00 00   pushq $0x0 
    1fe1: e9 0a 00 00 00   jmpq 1ff0 <_fopen$stub+0x1a> 
    1fe6: 68 0e 00 00 00   pushq $0xe 
    1feb: e9 00 00 00 00   jmpq 1ff0 <_fopen$stub+0x1a> 
    1ff0: 4c 8d 1d 11 00 00 00 lea 0x11(%rip),%r11  # 2008 <> 
    1ff7: 41 53     push %r11 
    1ff9: ff 25 01 00 00 00  jmpq *0x1(%rip)  # 2000 <> 
    1fff: 90      nop 

在正常情况下,我用代码“主要”部分,并conveted它的shellcode,并用这个代码来运行它

#include <sys/mman.h> 
#include <inttypes.h> 
#include <unistd.h> 

char code[] = "\x4d\x31\xd2\x41\x52\x41...For Example ..."; 

int main() 
{  
    int (*ret)() = (int (*)())code; 
    void *page = (void *)((uintptr_t)code & ~(getpagesize() - 1)); 
    mprotect(page, sizeof code, PROT_EXEC); 
    ret(); 
    return 0; 
} 

但在这种情况下,它这么想的工作,我知道我应该使用其他章节操作码在主要部分下面提到,但我不知道给他们打电话的安排。

请指导我。

+0

也是因为我这样做了一段时间,但我认为当你有像_fopen_和_fclose_这样的外部引用时,你不能只是objdump它。在您的shellcode中,您必须先确定这些函数的地址,然后才能调用它们。 –

+0

谢谢,你有没有例子? ,我不知道该怎么做,我搜索但找不到任何东西。 – user3323552

你的assmbly代码是用x64模式写的,你确定loader-'main'程序也是编译成x64的吗?