将“/ bin / sh”加载到寄存器中

时间:2014-12-22 10:54:53

标签: bash shell assembly buffer-overflow stack-smash

我试图编写ASM代码来生成shell。

我已经发现__execve的系统调用号是0x3b或59.

我需要发送"/bin/sh"作为第一个参数,指向{"/bin/sh", NULL}作为第二个参数,NULL作为第三个参数。

通过英特尔架构上x86_64 ASM的召集 - 第一个参数写入RDI寄存器,第二个参数写入RSI寄存器,最后一个参数写入{ {1}}注册。

这是我的代码:

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

yasm -f elf64 shell.asm -o shell.o ld -o shell.out shell.o 函数的GDB转储如下:

_start

正如您所看到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"指令?我将来如何调试此类问题?

1 个答案:

答案 0 :(得分:2)

①您无法将字符串加载到寄存器中,只能加载指向字符串的指针。

②你的叠魔术只是错误的。将其中一个加倍push rax移到pop rdi下方,该程序适合我。