传统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