Linux下的sys_execve系统调用

传统Int 0x80系统调用

系统调用号:EAX
参数:EBX、ECX、EDX、ESI、EDI、EBP
返回值:EAX

具体功能号在 unistd_32.h 文件中

64位系统调用syscall

系统调用号:RAX
参数:RDI、RSI、RDX、R10、R8、R9
返回值:RAX

具体功能号在 unistd_64.h 文件中

在pwn中一般是使用 sys_execve 系统调用来获取shell的。

sys_execve需要以下参数: 资料来自 syscalls.kernelgrok.com
char __user *
char __user *__user *
char __user *__user *
struct pt_regs *
第一个参数就是要传入的命令

32位情况下:

#define __NR_execve 11

调用示例:

    .intel_syntax noprefix
    .text
    .globl main
    .type main, @function
main:
.LFB0:
    push ebp
    mov ebp, esp
    // /bin/sh
    push 0x0068732f
    push 0x6e69622f
    mov ebx,esp
    mov eax,0x0b
    mov ecx,0
    mov edx,0
    int 0x80
    mov eax, 0
    pop ebp
    ret

    .ident "GCC: (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0"
    .section .note.GNU-stack,"",@progbits

64位情况下:

#define __NR_execve 59

调用示例:

    .intel_syntax noprefix
    .text
    .globl main
    .type main, @function
main:
.LFB0:
    push rbp
    mov rbp, rsp

    // /bin/sh
    mov rax,0x0068732f6e69622f
    push rax

    mov rdi,rsp
    mov rax,59
    mov rsi,0
    mov rdx,0
    syscall

    mov rax, 0
    pop rbp
    ret

    .ident "GCC: (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0"
    .section .note.GNU-stack,"",@progbits