# TPCTF
# maze
Welcome to the world of Maze!
上午 9 点下了附件解包了出了 so 文件 10 点出去帮室友忙了 下午回来发现题已经被学长拿下三血了 tql
故在赛后复现一下
objcopy --dump-section pydata=maze.dump maze
python pyinstxtractor.py maze.dump#得so文件
python 运行,附加调试 so 文件 (在_Py_Dealloc 可以断下)
看出来是 cpython 逆向,重点函数先看_pyx_pymod_exec_maze
调试可来到_pyx_pw_4maze_3c29sdmU 函数
v29 是输入的长度 说明输入长度是 33
(了解 python3 整数类型 PyLongObject 和 PyObject)
https://zhuanlan.zhihu.com/p/165375185
PyObject
可说是 CPython 最核心的数据结构了,在 Python 的世界里,几乎任何元素都是 PyObject 的指针(注意这里是指针,不是实际内存空间)
_pyx_pw_4maze_5run 函数 pyx_tuple__28 打印失败
回到_pyx_pw_4maze_3c29sdmU 函数 让输入长度是 33 继续调试发现
v52 是取了输入的一位 然后赋值给 once1nput (once1nput = PyLong_FromLong (v52)😉 一次取一位
发现有一个异或前一个是一次取的一个输入 后一个是已知数据
继续调试 有一个 PyObject_RichCompare 这里 v65 是比较数据
(第四行的才是数据)
逻辑大概就是异或 再对比 进行 33 次 (每一次比较若不对就会退出)
TPCTF {asdasdasdasdasdasdasdasdasd (测试数据)
理清逻辑后多调试几次最后会发现其实异或的是 "HITPCTF"
cmp = [0x1c, 0x19, 0x17, 0x4, 0x5, 0x2f, 0x3f, 0x7, 0x3c, 0xb, 0x10, 0x31, 0x31, 0x19, 0x25, 0x9, 0x27, 0x4, 0x70, 0x26, 0x19, 0x7, 0xf, 0xb, 0x3d, 0x2, 0xe, 0x3, 0x24, 0x28, 0x1a, 0x66, 0x3e] | |
flag = "" | |
key = "HITPCTF" | |
for i in range(33): | |
flag += chr(cmp[i] ^ ord(key[i % 7])) | |
print(flag) |
# 小 T 的日常
题目描述本题 flag 的正则表达式为 TPCTF\\{[A-Z]+:\\d+\\}
,其中 [A-Z]+
为小 T 家楼下商店街的一元店隔壁的服装店店名, \\d+
为这家服装店的电话号码
直接把图片中的地点社工出来在这儿 搜寻附近的关键词商店街里有一元店且隔壁有服装店的即可
(商店比较老网上没有电话 只有图片里才能看到)
得出 flag 为 TPCTF