# 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

image-20231125150951587

调试可来到_pyx_pw_4maze_3c29sdmU 函数

image-20231129213516487

v29 是输入的长度 说明输入长度是 33

(了解 python3 整数类型 PyLongObject 和 PyObject)

https://zhuanlan.zhihu.com/p/165375185

PyObject 可说是 CPython 最核心的数据结构了,在 Python 的世界里,几乎任何元素都是 PyObject 的指针(注意这里是指针,不是实际内存空间)

image-20231201174145192

image-20231129220843758

_pyx_pw_4maze_5run 函数 pyx_tuple__28 打印失败

回到_pyx_pw_4maze_3c29sdmU 函数 让输入长度是 33 继续调试发现

image-20231201181822158

v52 是取了输入的一位 然后赋值给 once1nput (once1nput = PyLong_FromLong (v52)😉 一次取一位

image-20231201181647688

发现有一个异或前一个是一次取的一个输入 后一个是已知数据

image-20231201175837641

继续调试 有一个 PyObject_RichCompare 这里 v65 是比较数据

image-20231201175926202

image-20231201182520366

(第四行的才是数据)

逻辑大概就是异或 再对比 进行 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+ 为这家服装店的电话号码

直接把图片中的地点社工出来在这儿 搜寻附近的关键词商店街里有一元店且隔壁有服装店的即可

image-20231201191937628

image-20231201192005252

image-20231201192040083

(商店比较老网上没有电话 只有图片里才能看到)

得出 flag 为 TPCTF

更新于 阅读次数