DASCTF2024暑期挑战赛
2024-07-21
Misc
EZ_zip
首先是最开始的flag文件,发现问题出在文件名大小,这两处都改成7就行
然后一直在想注释里的just a byte是啥意思,一直想的是跟password有关。一直用的是zipfile来爆破,后面才发现一个问题。
zipfile爆不了,同样的爆破脚本,zipfile爆不出来,但是pyzipper可以爆。编写一个爆破脚本并统计密码
import pyzipper
def crack_zip(zip_file_path):
for i in range(256):
password = bytes([i])
try:
with pyzipper.AESZipFile(zip_file_path, 'r') as zip_ref:
zip_ref.extractall(pwd=password)
extracted_files = zip_ref.namelist()
if extracted_files:
return password, extracted_files[0]
except:
continue
return None, None
def main():
current_zip = '320.zip'
all_passwords = ''
while current_zip:
print(f'Cracking {current_zip}...')
password, next_zip = crack_zip(current_zip)
if password:
all_passwords += password.hex()
current_zip = next_zip
else:
print(f'Failed to crack {current_zip}')
break
print(f'All passwords: {all_passwords}')
if __name__ == "__main__":
main()
得到密码是11bb99580c613a87c54e12480aa7ff8c798f71ad280f6ba69d4a4425225e4ec611bb99580c613a87c54e12480aa7ff8c798f71ad280f6ba69d4a4425225e4ec611bb99580c613a87c54e12480aa7ff8c798f71ad280f6ba69d4a4425225e4ec611bb99580c613a87c54e12480aa7ff8c798f71ad280f6ba69d4a4425225e4ec611bb99580c613a87c54e12480aa7ff8c798f71ad280f6ba69d4a4425225e4ec611bb99580c613a87c54e12480aa7ff8c798f71ad280f6ba69d4a4425225e4ec611bb99580c613a87c54e12480aa7ff8c798f71ad280f6ba69d4a4425225e4ec611bb99580c613a87c54e12480aa7ff8c798f71ad280f6ba69d4a4425225e4ec611bb99580c613a87c54e12480aa7ff8c798f71ad280f6ba69d4a4425225e4ec611bb99580c613a87c54e12480aa7ff8c798f71ad280f6ba69d4a4425225e4ec6
并且得到一个AES-ECB.txt
同时能很明显观察到这个密码是重复的11bb99580c613a87c54e12480aa7ff8c798f71ad280f6ba69d4a4425225e4ec6
然后得到AES的内容是64ZpNmbv2Hg4Jj9bH8Kv6D3OBliD9hgyI3vZWfMDJs2TcEwVnBmH/zkBtPBE3g8e the key may be on your journey?
尝试用这个密码当aes的密码不对,猜测是解压顺序是从320-->1,而密码顺序是1-->320,因此需要反过来
c64e5e2225444a9da66b0f28ad718f798cffa70a48124ec5873a610c5899bb11
DASCTF{514755c6-8280-463c-8378-a29702fc88df}
png_master
啧,做了好一会吃完饭才发现不只是02
第一段直接在图片尾,解base64,DASCTF{2fd9e9ff-e27
第二段是在图片里,LSB隐写,column,在A上面,全通道,d-5405-c5f5-
第三段是在多出来的IDAT块中,很明显被选中的块是多出来的块
尝试直接zlib解压后,得到的是一个长度750500的原始数据
发现filter第一个是01,后面都是02,就想着直接看data,结果没想到还有04之类的。根据开头的01 80 80 80 00 00……
可以猜出是RGB的图像,然后计算高宽可以列个式子。每行开头有一位filter,相当于图像的每一行是由1 filter + 3*width
组成的,整个文件是由(1 filter + 3* width)*highth
组成的,即(1+3*w) * h == 750500
,不难得出750500分解出来是750500 = 2^2 · 5^3 · 19 · 79
,由于存在(1+3*w)
,正好能发现19 * 79 = 1501 = 500*3+1
,而2^2 * 5^3 = 500
,一下可以得到长宽均是500。
这里就有了一个简单的做法,使用tweakpng,删除前面的IDAT
然后修改高宽为500,truecolor(RGB)
最后得到flag:DASCTF{2fd9e9ff-e27d-5405-c5f5-a19131f86216}
*ServerMeM
刚开始是这样的(在WSL里以下我未成功):
第一步是找版本python3 ~/volatility3/vol.py -f out.lime banners.Banners
0x6be001a0 Linux version 5.4.27 ([email protected]) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)) #1 SMP Sun May 26 03:37:06 EDT 2024
0x6ca73554 Linux version 5.4.27 ([email protected]) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)) #1 SMP Sun May 26 03:37:06 EDT 2024
0x6db8a060 Linux version 5.4.27 ([email protected]) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)) #1 SMP Sun May 26 03:37:06 EDT 2024
然后下载指定的版本
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.4.27.tar.xz
tar -xf linux-5.4.27.tar.xz
cd linux-5.4.27
安装需要编译的工具
sudo apt-get update
sudo apt-get install -y build-essential libssl-dev libelf-dev dwarfdump
编译内核
make olddefconfig
make -j$(nproc)
尝试生成module.dwarf
dwarfdump -di vmlinux > module.dwarf
但是一直是没有生成vmlinux文件。接着就尝试去装个虚拟机然后再编译这个内核,反正闲着没事然后编了一个小时
然后在编译完内核后加了这几条
sudo make modules_install
sudo make install
sudo update-grub
sudo reboot
重启后看一下
uname -r
完整安装
sudo apt update
sudo apt upgrade -y
sudo apt install build-essential libncurses-dev bison flex libssl-dev libelf-dev dwarfdump zip -y
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.4.27.tar.xz
tar -xvf linux-5.4.27.tar.xz
cd linux-5.4.27
cp /boot/config-$(uname -r) .config
make menuconfig
make -j$(nproc) CFLAGS_KERNEL="-g"
sudo make modules_install
sudo make install
sudo update-grub
sudo reboot
uname -r
嘻嘻,虚拟机里面的ubuntu出问题了,重新在不用的服务器里弄,时间来不及做题了。
......不做了,总之步骤就是:
找内核信息-->自创虚拟机更换内核-->生成dwarf与system.map制作profile-->放至vol的plugins目录下-->使用该profile进行取证,可以看看这篇文章:https://r0fus0d.blog.ffffffff0x.com/post/memory-forensics/#linux-profile,题目后面的内容就没去看了。
Reverse
DosSnake
注意到103D5中的这一段
seg002:0259 loc_105D9:
seg002:0259 mov cx, 20h ; ' '
seg002:025C lea si, aDasctf+6
seg002:0260 lea di, aDasctf
seg002:0264
seg002:0264 loc_105E4:
seg002:0264 mov al, [si]
seg002:0266 xor al, [di]
seg002:0268 mov [si], al
seg002:026A inc si
seg002:026B inc di
seg002:026C cmp di, 32Ah
seg002:0270 jnz short loc_105F6
seg002:0272 lea di, aDasctf
seg002:0276
seg002:0276 loc_105F6:
seg002:0276 loop loc_105E4
seg002:0278 lea si, aDasctf+6
seg002:027C
seg002:027C loc_105FC:
seg002:027C mov al, [si]
seg002:027E cmp al, 0
seg002:0280 jz short locret_10609
seg002:0282 mov ah, 0Eh
seg002:0284 int 10h
seg002:0286 inc si
seg002:0287 jmp short loc_105FC
然后注意到DASCTF那一段的值3F 09 63 34 32 13 2A 2F 2A 37 3C 23 00 2E 20 10 3A 27 2F 24 3A 30 75 67 65 3C
与DASCTF进行异或操作
提交H0wfUnnytheDosSnakeis!!!
即可
Crypto
complex_enc
问的GPT
from Crypto.Util.number import *
import ast
def read_output_file(file_path):
with open(file_path, 'r') as f:
content = f.read().strip().split('\n')
c = int(content[0].strip())
key = ast.literal_eval(content[1].strip())
return c, key
def dec(c, key):
m = [0] * (len(key) - 1)
for i in range(len(key) - 1, 0, -1):
if c >= key[i]:
m[i - 1] = 1
c -= key[i]
return m
def bits_to_bytes(bits):
byte_list = [bits[i:i+8] for i in range(0, len(bits), 8)]
byte_values = [int(''.join(map(str, byte)), 2) for byte in byte_list]
return bytes(byte_values)
if __name__ == "__main__":
c, key = read_output_file('output.txt')
m_bits = dec(c, key)
print(''.join(str(i) for i in m_bits))
然后发现没有开头的0,手动补一个0
DASCTF{you_kn0w_b@ckpack_Crypt0?}