HGAME2023 week1 writeup
web
Classic Childhood Game
js没有被混淆,直接翻,翻到Event.js最底下有个可疑的函数mota(),控制台执行得到flag
Guess Who I Am
根据html中的hint得到id和说明的json,用python简易写个脚本即可。注意其中有转义符的问题,不过因为100次不是很多,手动修正即可,脚本写得不是很完美但是能用。
1 | import requests |
Show Me Your Beauty
文件上传的后缀名没有过滤大写,传个后缀名.pHp的一句话木马即可getshell
reverse
test_your_IDA
有现成字符串,打开IDA一眼出
easyasm
这么短的汇编代码,往下直接找xor,找到了
1 | xor eax,33h |
也就是把最后的字节串异或0x33,得到flag
easyenc
编码方法
1 | enc=(text^0x32)-86; |
提取出编码后的41字节,然后写出对应解码程序
1 |
|
a_cup_of_tea
通过题干猜测tea加密。因为程序使用了优化,IDA中需要进行一些小调整。分析得delta, key。解密程序
1 |
|
encode
观察编码方式,发现是将一个字节的高4位和低4位分别储存,得解密程序
1 |
|
pwn
test_nc
nc上去直接cat flag
easy_overflow
一个很大的溢出,有个后门函数,注意64位下system函数要栈以16字节对齐,所以增加一个ret。程序关闭了stdout,因此考虑用stderr输出。可以使用cat flag>&2或/bin/sh flag
exp:
1 | from pwn import * |
choose_the_seat
type confusion导致可以输入负数,程序Partial RELRO,并且在完成操作后调用exit函数,考虑劫持got表。先把exit劫持为main,再通过setbuf函数泄露libc基址,最后输入/bin/sh并且劫持puts为system即可getshell。exp
1 | from pwn import * |
orw
因为ban掉了execve和execveat两个syscall,考虑orw。程序读取了很多,但是溢出比较少,考虑使用栈迁移。直接栈迁移到bss段即可。因为linux中按0x1000大小分配内存,因此bss段后面有不少空间。不过我做这道题的时候铸币了,所以泄露了栈地址,做麻烦了,不过原理类似。exp
1 | from pwn import * |
simple_shellcode
ban了getshell的路径,用orw。shellcode给了0x10大小的读,肯定要再通过一个read读入shellcode。注意到执行shellcode时rdx为0xCAFE0000(一个大数),很容易构造出一段read的shellcode。exp
1 | from pwn import * |
crypto
兔兔的车票
图片是随机生成的噪点图,考虑从异或运算的性质解决问题。注意到source中的噪声图补了很多0,因此像素点中有很多(48,48,48)的像素,因此将一张有意义的图片与source进行异或后,仍会较容易辨识。因此我们只要找到车票与source图片异或后的图片即可得到flag。我们这里不妨设
$$
\begin{align*}
enc1&=source1 \oplus n1 \
enc2&=source2 \oplus n2 \
enc3&=flag \oplus n1 \
\end{align*}
$$
所以
$$
enc1 \oplus enc3 = source1 \oplus flag
$$
那么如何分辨这些enc图片是和nonce数组中的哪个异或得到的呢?我们可以从enc0开始与其他enc图片进行异或,由于source噪声图存在很多(48,48,48)像素,同色像素异或后为纯黑像素,异或后如果图片比较暗则说明这两张图片是异或同一个nonce元素得到的。由此我们从enc0开始进行图片的两两异或,发现enc1^enc6后得到了车票图片,即可得到flag
RSA
factordb可以直接分解,然后就是正常的RSA解密流程
1 | from Crypto.Util.number import * |
Be Stream
二阶线性递推得到stream数列的通项公式,然后利用模运算的性质降低运算量后能秒出。解题脚本
1 | import sympy |
misc
Sign In
base64直接解码
Where am I
wireshark提取出fake.rar,推测为伪加密,010editor更改加密位后得到Exchangable.jpg,查看exif信息转为度分秒格式的经纬度得到flag
神秘的海报
lsb提取出flag part1,得到提示6位数字密码。ctf常用的6位数字密码114514或者123456,用steghide试一下123456就出了。
e99p1ant_want_girlfriend
根据题目提示crc32,推测修改了图片大小,png格式修改宽之后图片会损坏,无法查看,因此直接把高设为一个很大的数即可得到flag。
Blockchain
Checkin
按照题目操作后,查看合约源码,只要调用setGreeting函数即可。remix跑一下得到data,解题脚本
1 | from web3 import Web3,HTTPProvider |
IoT
Help marvin
拿到一个逻辑分析仪抓到的波形文件,PulseView打开后观察波形,一眼SPI(不过时钟波形也太不规律了),CLK:d0;MOSI, MISO:d2;CS:d1
提取数据得到flag
Help the uncle who can’t jump twice
根据提示,为mqtt协议,拿到用户名Vergil。mqtt-pwn爆破密码得到power,然后查看公告板Nero/#即可得到flag。