SJTU-CTF 2019 WriteUp Misc & Reverse

Misc

Sqlmap yibasuo

200 pts, 36 solved

The hacker stole the flag in the database through sqlmap

  1. 得到 .pcapng 格式的抓包数据文件,用 wireshark 打开

  2. 使用 http contains sqlmap 作为 filter,过滤得到 sqlmap 请求列表

  3. 观察发现属于 sqlmap 二分法逐个匹配字符的盲注模式,且请求数据都为 chunked 编码

  4. 更改 wireshark 设置,开启 Reassemble chunked transfer-coded bodies,分析 POST 数据,POST 数据中都有统一格式,例如:

1
name=hhh'||(SELECT 'FGtK' FROM DUAL WHERE 7118=7118 AND 9632=IF((ORD(MID((SELECT IFNULL(CAST(flag AS CHAR),0x20) FROM test.flag ORDER BY flag LIMIT 0,1),38,1))>112),SLEEP(1),9632))||'&pass=xxx

其中 38 是目前匹配的字符所在位置,112 为 ASCII 码,一定次数的比较之后会出现类似于 !=112的请求,此处的 112 即为匹配出的字符 ASCII 码

  1. 应用过滤器 urlencoded-form.value contains "!=" && urlencoded-form.value contains "flag"

逐字匹配出 flag: 0ops{de7a60237960df7af6fc0af9563cbbcb}

Dog

400 pts, 17 solved

I go on a trip with my GF, lol. Can you find our secret?

  1. 下载 1a438be9c75e4c54a48f57dfcf503f41,文件以 50 4B 03 04 开头,说明为 zip 压缩包,更改后缀名为 .zip

  2. 打开压缩包,发现内容已被加密,然而先前以 16 进制打开时却能看到 flag.txt 的明文内容,说明是伪加密;将两个核心目录区的加密标记位改为 0,再打开文件,发现加密已经消失

  1. 解压得到 flag.txtflag3.zip,然而 flag.txt 中并不是真正的 flag

  2. flag3.zip 为加密压缩包,用 010Editor 打开发现末尾有多余的 32 个字符 O5CWYYZQNVSV6MS7JU3V6U3QIE2A====,识别为 base32,解码后得到密码:wElc0me_2_M7_SpA4

  3. flag3.zip 解压得到 small 文件夹如下,打开第一个文件,发现 exif 字符串,说明是图片,使用 cat flag* > small.jpg 合并得到完整图片

  1. 使用 binwalk 发现新图片中藏有加密压缩包,图片中有文字 Where am I ,右上角有文字 XX.XXXXXX,XXX.XXXXXX(经纬度),指明了压缩包密码格式
  1. 从图片 EXIF 信息中得到 GPS 位置: 30.254137,120.147965(建议使用工具获取原始数据以避免误差),解压再次得到假的 flag.txt 和加密压缩包 flag.zip
  1. flag.zip 中备注密码是 QQ 号,然而看样子并不能用社工,但可估计在 5~11 位,故用 ARCHPR 暴力破解得到密码:44174798,解压得到 flag1.jpg
  1. 仔细观察发现图片中划横线处有隐藏文字,调整图片,看清文字为 flag: 0ops{k1ll_s1nGle_D0g} (单身狗保护协会表示强烈谴责)
  1. 下载压缩包,解压得到 logo.png

  2. 利用 Stegsolve 探测 RGBA 最低比特位,发现一堆黑色方块

  1. 分离 RBGA 最低位的四张图片,合成得到一个二维码,扫描得:secret: I'm_th3_k3y_t0_th3_f14g
  1. binwalk 扫描 logo.png ,发现 png 文件后还藏有信息,分离,观察发现 PK 反转后是 zip 压缩包特征码 KP(倒置的 LOGO 也暗示了这一点),需要整体反转
  1. 反转后得到一个带密码的压缩包,输入扫描二维码得到的密码,解压得到 flag.txt,打开得到 flag: 0ops{LSB_and_reversed_ZIP_b2c6490f523a9045}

Anti Hack 01

200 pts, 23 solved

We are tracking a super hacker, but first we need to get some evidence.. Can you find the secret in his memory?

Hint1: Absolutely you cant handle it by yourself without some tools…

  1. 可知是内存取证题,下载 memory dump,使用 volatility 进行分析,首先分析镜像信息:
1
volatility -f antihack01.raw imageinfo

可以看到可能性最大的架构是 WinXPx86

  1. 查看进程列表:
1
volatility -f antihack01.raw --profile=WinXPSP2x86 pslist

可以看到比较可疑的进程有 notepad.exemspaint.exe

  1. 扫描可疑文件:
1
volatility -f antihack01.raw --profile=WinXPSP2x86 filescan

发现桌面有一个 flag.txt

  1. 导出 flag.txt
1
volatility -f antihack01.raw dumpfiles -D ./ -Q 0x00000000021cff90

good job, but flag are not here.

(好,被耍了)

  1. 看看屏幕截图:
1
volatility -f antihack01.raw screenshot -D ./

可以看到最后面的窗口应该是 flag.txt 的记事本,左边是导出内存数据用的 DumpIt.exe,右边是画图软件 mspaint.exe

  1. 导出 mspaint.exe 的数据:
1
volatility -f antihack01.raw memdump -p 1368 -D ./
  1. 将导出的 1368.dmp 重命名为 1368.data,用 GIMP 以“原始图像数据打开”,调节“高度”、“宽度”和“位移”三个属性,直到看见清晰的图像:

电脑屏幕常见分辨率为 1920 * 1080,猜一猜也是不错的办法

  1. 稍微处理一下图像,可以看到出题者确实是在画图软件里画出了 flag:

flag: 0ops{volat1l1ty_1s_awe3ome}

Anti Hack 10

250 pts, 8 solved

In anti-hack01, we found something in his memory! So we searched his computer. Can you find the secret in his ext4 disk?

Hint1: superblock

  1. 解压得到 disk.img,尝试挂载,失败

  2. 尝试用 fsck.ext4 修复,失败;使用 debugfs 分析,提示 Bad magic number,用 hexedit 打开,查看 magic number 所在位置,将 EF 53 改为 53 EF

  1. 挂载仍然失败,debugfs 提示 superblock is corrupt

  2. superblock 的位置在 0x400,备份块的位置在 0x8000000, 0x18000000, 0x28000000… 将第二个备份块的数据直接覆盖 superblock,debugfs 提示 Bad magic number,将 magic numberEF 53 改为 53 EF 再用 debugfs 打开,这次仍然报错但已经成功打开

  3. 使用 ls 浏览目录内容,进入用户目录查看 .bash_history 中的命令历史:

1
2
3
4
5
6
7
8
➜  antihack10 debugfs disk.img
debugfs 1.44.1 (24-Mar-2018)
Checksum errors in superblock! Retrying...
debugfs: ls
debugfs: cd /home/rainhurt
debugfs: ls
debugfs: cat .bash_history
vim /etc/.flag
  1. 尝试查看 /etc/.flag 但找不到文件,进入 /etc 目录,发现 vim 临时文件 .flag.swp,文件内容是一串 base64 字符串,解密后得到 flag: 0ops{V1m_1S_n0t_4Af1}
1
2
debugfs:  cat .flag.swp
b0VIM 8.1rainhurthacker/.flag U3210#"! UtpadMG9wcyU3QlYxbV8xU19uMHRfNEFmMSU3RA==

42

250 pts, 7 solved

1.根据题目提示:The answer to life, the universe and everything ...,进行搜索,发现最近一则数学家将 42 表示为三个立方和形式的新闻,输入三个立方和的底数:

1
-80538738812075974 80435758145817515 12602123297335631

2.得到 flag: 0ops{12499142631077172}

当然也可以用 Go 语言逆向求解

Reverse

Snake

  1. 查看文件内容,判断为 .pyc 文件,即 Python 代码经过编译的文件,进行反编译

  2. 将反编译得到的随机字符变量名替换成相应字符串:

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
45
46
47
48
def myFunc(parameter):
if len(parameter) != 17:
return False
elif parameter[10] != chr(99): #c
return False
elif parameter[3] != chr(121): #y
return False
elif parameter[7] != chr(95): #_
return False
elif parameter[4] != chr(95): #_
return False
elif parameter[12] != chr(109): #m
return False
elif parameter[5] != chr(112): #p
return False
elif parameter[14] != chr(105): #i
return False
elif parameter[0] != chr(101): #e
return False
elif parameter[8] != chr(100): #d
return False
elif parameter[15] != chr(49): #1
return False
elif parameter[6] != chr(121): #y
return False
elif parameter[11] != chr(48): #0
return False
elif parameter[9] != chr(101): #e
return False
elif parameter[2] != chr(115): #s
return False
elif parameter[1] != chr(52): #4
return False
elif parameter[13] != chr(112): #p
return False
else:
return parameter[16] == chr(101) #e


if __name__ == '__main__':
pass
if len(getattr(__import__('sys'), 'argv')) != 2:
print(f'''./{(getattr(__import__('sys'), 'argv')[0])} passwd''')
else:
if myFunc(getattr(__import__('sys'), 'argv')[1]):
print(f'''0ops{{(getattr(getattr(__import__('hashlib'), 'md5')(bytes(getattr(__import__('sys'), 'argv')[1], 'ascii')), 'hexdigest')())}}''')
else:
print(chr(120))

3.根据程序逻辑推出 passwde4sy_py_dec0mpi1e

4.将 passwd 作为参数,根据程序输出得到 flag: 0ops{8122a07872547d12439f8086ebc2957a}

References

  1. Wireshark 使用技巧及数据包分析方法
  2. 【CTF】利用 volatility 与 Gimp 实现 Windows 内存取证
  3. 在线 pyc 文件反编译
Author

Googleplex

Posted on

Feb 17, 2020

Updated on

Jan 24, 2021

Licensed under

Comments