# BPy_FlagChecker

首先通过题目的提示安装好 python3.10 的环境,然后通过分析下载的附件 chall.py 可知需要我们伪造个钩子脚本来进行 hook,从而把题目里用到的标准库模块换成我们自己的版本。即运行 sim.py 脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def main():
import marshalx as marshal, inspect
c=b'\x87\xfcA@\xc7\xc4\xea\xf5\xa6\x87\x84\x02\xd6\x9e\x85\x93\xdeM\xa9\xe7\'\xf1\xaf\xe7\xc5\xde:\xff\xff\x95\x9a\xce\x05v\xd21\xce~\xa5\xb6\x19KI\xafd\xf2\xb5D\x1d\xa9:<7\x97<\xc8\xfd\x02\x9fK\x9a\x14\xb3\xc8\xb82\x90\x1a7\x140j\xffw\xe6\xb1s\xcd|s\xfd\x99\xf4b\xe1Z\x9e\x86\xf1%q\x05\xf0\xfb\xd2\xf0G\xd5x\xc0A\xac\xc4\xe5\xca~}2\x8e.\x9d6\xbe\xe2\x9a\xa0u=\xe0\x98\xaa\xc1xl\x1aI~T\xec\xfe\x95F\xbbS1)\x7f\x01\xdam\xb7>\x91\xf0\xb9-"1\xa1V\xf4\x18{3\'\x8b\x16\xeb\x92%\r<\xbe\xe3\xda\xcc\xc1\x03\xae\xf7h\xe6\xd7\xa8h\xe4\x1dM\xf53.-o\xd7\xb4\x1b\xdd\x1f\x7fG\xeb[o\xbab\x1fZF\xa1\xbd\x81\xe5\xb3)\xdf\'\x01\xdb\xe0j\xd6\xf6\x8b+\x1b\xee\x97\xcb\x9c\xf7\x03\x00p\xdb\xe89}\xc8\xd6\xd2Tu\x85y\x08\xfa\xe2\x98\xd2\xfa\n\x00v\xd4\x0cr\x02ew\x99\xe6\xe2\x1b\x8b\xbd]\x08\xb2\x07\xdfg\xc2\xf3\xd32\xe65\xf1\xa4\x02:\xbe\xf6\xa4\xea\xe1\xc9 \xa4E\x9c\xe3\xf95\x81\xbdd\xb3&\xf7%\x8a\x05\x18\x1a\xdc\x00\x08\xd2\x95\xd8\x06\xc7\xe4\xfaI\xe5\x80K\x99\xfa\xd9\x8a\xc5d\x18\x03\xc6\xd4\x13m4\xf1ts\x866\xe0\xae8$\xb0z\x85\x0bU\xfdC\xe6\xc2\xef:Ra\xd2\x07h\xdf\x9b\xaa\xd8\xa3\xc1\xee}\x0b\xd0\x97\xb7\x11U\x98\x89E\x88\xfd\xa8\x85\x84Ez@\x92U\x8a6\xcb\x18\xb7\xe0$\xfe\xa6\x0f]\xbd\x05p\xc4\xa8"\xc0w\xd7I\xfd\x84\xe8\xb5\xa7\xc9A\x01\tV\xbb\xaa@HTiK\xab)W\xb3\xdf\x0e\xb0\xd8\x93Oh`\xf7[b\xbaB\x8f\xe2\x9d\tpXA\x11\x04\xa2N\x9e;\x07J\x9c@"\x90^9\xdc\x10\x87`9\xbe\xfc|\x04\xb6"\x95\xd7l\xf4\x07;\xfb\x8a\xf3\xc4\xd6\xa2T\xcc\x18v~y8RE\xca,Q\xf5\xb5\xed\xd6,6\xf1i%\x92\xc3\x83\xda\xdc-\x0fWe&/I\x04\x1e\xf4Y\x14]\xb3e\x97\x84\xe1\x922\xd0\x96e\xc2\x161\xebtr\xe8\xa3\xea(\x18!\x83\xf9\x0b+\xc1\x01\x1f\xcec\x1f\x91\xf2\xd8f\xbav\xf9\t\xd7\xab\xd4\x84\x10L\x95\xe7\xf5\xcf\x15\xdf\x9d\xad\xfa\xac\x9d\xcbJ\x86\x14^P\n\xbc\xbd\x1f\xbb\xaen\xe4\xd0q\xc0\xd8\xb3\x97\xdc\x92P\xaa\xe4j\x813~\xd0_q\x88y\xff[\x00\xaa@\x90\x87\x905\xb0\xc3\r\x91\t\x9f>\xdd\x17\x19\xe1.\x8eR\x06/\x99\x1b\xff\x8a\x95qY\xa3h\x10\xcau\x0c\x0b\xb8\xb5\x13\xf6\xde\x06\x9c\xb6\xffS\x819\x8e8\'\x1e\x0fker\xbcD\xc99\x9d\xda\x8b\xbd\x0e\x9cbF?\xe8,\x17w\x8d\xafk\xee\'\x7f\x9b\x07\x91{I\xd0\xbbi$\xf8\xad\xed\xcf\x83\xb8\xee\xbe\x8aM\xa3Ea\xe5\xe3s\xaf\xe5\xcc:<!\xee\x03\x96[\xf6\xde\xe0\xfa\xb0}\xfa\xdb\x95\x9eio\xba\xc8Oo\xc4^_\x12\x88V\xe5\x0c\x01\x07\x87{\xfc\x93,h\x94\xc1\x80\x96\xac6\xdf\x98+M\xd6\xd0\xcf\x15\xd6>H\x11)\x140\xf7\x12t[\x1a\xa7\xcc\x80v\x18<\xb7\xafOa;o\xf4\x86K\xcf\xe6\x87\xaa\xaaLfk\xc7w \x7fNk\xc0\x9f\xc8b\x1aFo\x80\x07 YRa\x96\xa6\xbcH\x84)SK\xda\xaeX\xbd\x82\x8d6\x11U6d\x91\xb101I\x17\xe0\xe7\xf0\xcc\xd7\x1a@t\xe4\\\x06]\x19\x975\xa2(\xc3\x13\xe3^my\xbe<\xe0\x05\xb8Cue\x9c\x18o3\xe9\xd4-\x10\x14\x9ea\xad\xcb\xd2\xee\xaa\xa0>re\x8a\xb9\x1d\xba\xd2\xb81[\xe7\xd19\xf5\x12\xfe~\xf4\xc5)\x15\xe0o\x01%?#\x94\xde\xa9\xc3g(WDN9\xd8\xeb\xb4\xef8?\xf6\x18\xbdu\x16\x8c"\xbe?c\xb7P\xd1V\x8d\x14\x94\xb8\xaa\xac,=\x81g\xd7G\xac\xf6\x84\xe8\x90\x7f\xce\x1crz@\x9e\xaf\xed\xa1\xb2@\x91\x8c\x89\xe6\xa8\xa5\x9c|\x1cq\xb0|1\x06\xe6\x87\xfcn3\x80\xc2\xb0\x8c\x0cI"\x1c48yC\xe2.\x7f\x7f"k\xbb\xae\xf5a/\xfa\x9f\n\x01\x00\xc7\xb9\xb0C\xff\xb6Y)\xf5a)5`\xf9iqx\xe03Z\xf0\x0bW\x0e\xa7\t\xb4\x98J\xf6\xe2\xa4\xaa\x1eG\xeeD\xe1\xadD\xbe\xfb\r/\x97v\x86j~\xbe\x9d\xf4F\xc0:$\x8a\x06n\x12`sE\xd4\xdc\xe5i\x1a$^\xd4\x06r\x87-bj9Ik[\ru\x8f\xb3q\xb9Y\xc1\xa6\xe8\xb3\xd8)'
def e(m, k):
r = []
r += [m[0]^(sum(k)&0o377)]
for _, i in enumerate(m[1:]):
k = e(k, [m[_]])
r += [i^(sum(k)&0o377)]
return bytes(r)
print("This is a simple python flag checking service.")
flag = input("Please give the flag to check: ")
k = [117, 167, 0, 48, 34, 58, 159, 220, 195, 70, 136, 149, 48, 125, 238]
try: exec(marshal.loads(e(c, k)))
except Exception as e:
print("That is not the flag")
print(e)


if __name__ == "__main__":
main()

运行这个脚本就可以把标准库模块换了,然后再去运行 chall.py 从而得到 l2 值和 k 值
1
2
3
4
5
6
7
8
9
10
11
12
 k=[(a*b)&0xff for a,b in zip(map(sum,inspect.getsource(main).encode().splitlines()),map(len,inspect.getsource(main).encode().splitlines()))]
try: exec(marshal.loads(e(c, k)))
except: print("That is not the flag")


if __name__ == "__main__":
main()
333
l2 b'P\xa6wA\xea([\x9f\x98\xde\x1d\xf7D\x86/\xd4\xeb\xc9\xf0+F\xc3\x94\xc4\x9dn\x95\xa1\xe2\xaa\xf5\xfd\x808\xdbF.x\t\xfa\xd9\x1c\x81\x86y\xc8\xf1j\xed\x83\xbe\xd9\xc4\xb6N\xa7\xdbK\xe9e,\xf0SU\xa2:\x88}P\xca3\xff\xf3\x80\x01\x8a\xcb\x1a\xb2)\xdeM\x89|,\xfc>\xb18TV\x9fy\xeb\x97\xddf\t\xe4\x05\x11\xb0\x1d|y\xb2\xa7G\xe6\xa2-\xf2\xcd\x8b&\xc5d\x91Rg/h\x7f\x7f$\xf0\x08\xda;\xfc\x8d\xaa\xb7;\x91Eq,\xf6X\x19 \xc2\xae\x7f\x8ba\x1e\xcd_\xff\x1aA\xfd\xd52=\xd0\xec\xa5\xa5\xe1\xb4\xcf\xb8\xd2i\xa2X\x15\xd7\x80\x14\xe3\xe9\xa4\x06QG\x89B\xd7u\xc2\xb0\x80\xe1\xfd.\xbb\x88\x9f\xde\x07\x1c\x91\xd6\x7f \xf0ag[\xa7\x1d\xd92?m\xb5r\x84\xa3zh\x84\xc9\xe8\x9a\xf1-\xb4\xfe=j\xf0\xeb\xf62\x99\r\\\x16Q;M\xcb\r5(J\xd1\r+j\x11\x9e!P\xd0\xbb\xf5\xdd\xefJ\xe0f9.\xf6}\xc6+\x998\x9c\xb5\xcd1\xa0\x01\x08\r\x89^$\x88\x89\xc78\xbd\xdbL\xcb\x8c8\x16v\xfe\x05{S\xa3q\xe0@\xa1\xda\xb0\x00\xb2\x0c\x18\xf2\xe7\xb6\x81\t\n\x9c\x9c\x93\xcaz\x99kq\x8f\x15\xf6W\xd5\xcc}\x9a\xca\xc8\xa0\xda\xfe\xa1\xae7\xad\xd1\x1e\xd5\xd5#hS\xc7|\x01\n\xe0\xcdS\xe9&\x01\xe6h\xff*\x06\xc4\x8e\x0b\xddP\x8fa9\xa4E\x1a\x90\xfb$\x11\xf8FvV\x83Pg\xdbu\x9f`\xe8\x17\x0e?o\xb3\rU\xbbv\x8a\x07\xe7\xae\xc5Ho\xe3da\xf3\n\xd2]\xddZ\x9bWY\x9e\xea\xb9D\xbe\xb61\xb4\xab\xff\'\x92;\xa6\xe2k\xaa\x19\xdc\x8f\x02\x14W\'\xcdL\xe1\xbe\xdf\x1eJ\xb514\xec4\xcb\x94/\x87}\xea{\x8ev\x1fiJ\'\xc5\xdf\xdc\xad\xf24\x82\na\xf1\xf7\xe9vM\x08;|\xca\xfa\x89 \x17\xfdrQP\x8eOe\x1d\xdcV\x00\xee\xe9\x1b\x83E\xe2\xcbi\xfc$]\xa2\xb1\x1c&\x11\xe1\x14\x15c\xfe\x18\xaf6\x7f\xb9\xd0\'\xdbM\xe8\xf7\x87\xba\x1f\xde\xca\xf0\x17\x0e\xe4\xc0\x11\xb3\x8c<\xe7f6\x93\x9a\xdb\xe0q \x91\xb8\x16\xbd\xd1lX8(\x16]\x913s|\xa5\xd3}U\x92\x01\x95\xdb\x13\'.\xa2\xe8\xfbXq\xb0\x16uB\x06\x912\x8aQ@\x82\x89\xd7\xea\xac\x9b>(G\xe7\x8e\xf2>\x18\x85\xd2P\x84`\x9f\xcd\xb7\r\x1aE\x95\xc9\xac\x1e\xee\x9b\x95\xa4B\x13\xd4\xc7k\xe1 Q\x85\xf6P\xba4\xa9*\xb6\xac\xde\x8f\xa9\xb6Z\x06i>\x98\x8bK\x1eg=\r\x92\x0c}\x94\xc34\xb1\xa8\xf4\x06\r&\x8d"\r\xcdH\xfb\xc4\x85XMSc7}\xdc>\xa0\x0e0A\xe4\x01\x13\xe5Bo\xdd-\xcbA9\xb7\xf6!\x12\x9b\x05\xa5\xe0\x18\xadQ^\xf6\xa5\xd1\xd2\xc5\xe7\x1c\xcbZ\x1a1bXa^\xef\'l\xc5\xf7\xc4\xb54\x1a\xda\x1c\x06\x93\xfd\xe0\xf1\xf3_>vFF\x7fVi.\x8fP;V\xed\x08\xfd\xce\xbc\xb7G\xaa\xedq\xd5 \x1a\x9e8^\xdd\xb8\x87\x07`<\xcf\xd7z+\xf3\x16\x00\x00\x00t\x00|\x00\x83\x01\\\x02}\x01}\x02d\x01\xa0\x01|\x01\xa1\x01S\x00\xf3f\x00\x00\x00g\x00}\x02|\x02|\x00d\x01\x19\x00t\x00|\x01\x83\x01d\x02@\x00A\x00g\x017\x00}\x02t\x01|\x00d\x03d\x00\x85\x02\x19\x00\x83\x01D\x00]\x17\\\x02}\x03}\x04\x88\x00|\x01|\x00|\x03\x19\x00g\x01\x83\x02}\x01|\x02|\x04t\x00|\x01\x83\x01d\x02@\x00A\x00g\x017\x00}\x02q\x17t\x02|\x02\x83\x01S\x00'
loads called 44463 b'\xe3\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x02\x80\x00\x00@\x00\x00\x00s\x16\x00\x00\x00\t\x00\xe4\x00\xe4\x01\x84\x00Z\x00e\x00e\x01\x83\x01\x01\x00\xe4\x02\xd3\x00)\x03c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x0f\x00\x00\x00V\x00\x00\x00\x03\x00\x00\x00s\x1c\x04\x80\x00d\x01d\x02l\x00m\x01\x89\x1f\x01\x00\xe4\x01\xe4\x03'
error marshal data too short
That is not the flag

结合 l2 和 k 值来编写 test.py:
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import marshal
import inspect


def main():
import marshal
import inspect
c = b'\x87\xfcA@\xc7\xc4\xea\xf5\xa6\x87\x84\x02\xd6\x9e\x85\x93\xdeM\xa9\xe7\'\xf1\xaf\xe7\xc5\xde:\xff\xff\x95\x9a\xce\x05v\xd21\xce~\xa5\xb6\x19KI\xafd\xf2\xb5D\x1d\xa9:<7\x97<\xc8\xfd\x02\x9fK\x9a\x14\xb3\xc8\xb82\x90\x1a7\x140j\xffw\xe6\xb1s\xcd|s\xfd\x99\xf4b\xe1Z\x9e\x86\xf1%q\x05\xf0\xfb\xd2\xf0G\xd5x\xc0A\xac\xc4\xe5\xca~}2\x8e.\x9d6\xbe\xe2\x9a\xa0u=\xe0\x98\xaa\xc1xl\x1aI~T\xec\xfe\x95F\xbbS1)\x7f\x01\xdam\xb7>\x91\xf0\xb9-"1\xa1V\xf4\x18{3\'\x8b\x16\xeb\x92%\r<\xbe\xe3\xda\xcc\xc1\x03\xae\xf7h\xe6\xd7\xa8h\xe4\x1dM\xf53.-o\xd7\xb4\x1b\xdd\x1f\x7fG\xeb[o\xbab\x1fZF\xa1\xbd\x81\xe5\xb3)\xdf\'\x01\xdb\xe0j\xd6\xf6\x8b+\x1b\xee\x97\xcb\x9c\xf7\x03\x00p\xdb\xe89}\xc8\xd6\xd2Tu\x85y\x08\xfa\xe2\x98\xd2\xfa\n\x00v\xd4\x0cr\x02ew\x99\xe6\xe2\x1b\x8b\xbd]\x08\xb2\x07\xdfg\xc2\xf3\xd32\xe65\xf1\xa4\x02:\xbe\xf6\xa4\xea\xe1\xc9 \xa4E\x9c\xe3\xf95\x81\xbdd\xb3&\xf7%\x8a\x05\x18\x1a\xdc\x00\x08\xd2\x95\xd8\x06\xc7\xe4\xfaI\xe5\x80K\x99\xfa\xd9\x8a\xc5d\x18\x03\xc6\xd4\x13m4\xf1ts\x866\xe0\xae8$\xb0z\x85\x0bU\xfdC\xe6\xc2\xef:Ra\xd2\x07h\xdf\x9b\xaa\xd8\xa3\xc1\xee}\x0b\xd0\x97\xb7\x11U\x98\x89E\x88\xfd\xa8\x85\x84Ez@\x92U\x8a6\xcb\x18\xb7\xe0$\xfe\xa6\x0f]\xbd\x05p\xc4\xa8"\xc0w\xd7I\xfd\x84\xe8\xb5\xa7\xc9A\x01\tV\xbb\xaa@HTiK\xab)W\xb3\xdf\x0e\xb0\xd8\x93Oh`\xf7[b\xbaB\x8f\xe2\x9d\tpXA\x11\x04\xa2N\x9e;\x07J\x9c@"\x90^9\xdc\x10\x87`9\xbe\xfc|\x04\xb6"\x95\xd7l\xf4\x07;\xfb\x8a\xf3\xc4\xd6\xa2T\xcc\x18v~y8RE\xca,Q\xf5\xb5\xed\xd6,6\xf1i%\x92\xc3\x83\xda\xdc-\x0fWe&/I\x04\x1e\xf4Y\x14]\xb3e\x97\x84\xe1\x922\xd0\x96e\xc2\x161\xebtr\xe8\xa3\xea(\x18!\x83\xf9\x0b+\xc1\x01\x1f\xcec\x1f\x91\xf2\xd8f\xbav\xf9\t\xd7\xab\xd4\x84\x10L\x95\xe7\xf5\xcf\x15\xdf\x9d\xad\xfa\xac\x9d\xcbJ\x86\x14^P\n\xbc\xbd\x1f\xbb\xaen\xe4\xd0q\xc0\xd8\xb3\x97\xdc\x92P\xaa\xe4j\x813~\xd0_q\x88y\xff[\x00\xaa@\x90\x87\x905\xb0\xc3\r\x91\t\x9f>\xdd\x17\x19\xe1.\x8eR\x06/\x99\x1b\xff\x8a\x95qY\xa3h\x10\xcau\x0c\x0b\xb8\xb5\x13\xf6\xde\x06\x9c\xb6\xffS\x819\x8e8\'\x1e\x0fker\xbcD\xc99\x9d\xda\x8b\xbd\x0e\x9cbF?\xe8,\x17w\x8d\xafk\xee\'\x7f\x9b\x07\x91{I\xd0\xbbi$\xf8\xad\xed\xcf\x83\xb8\xee\xbe\x8aM\xa3Ea\xe5\xe3s\xaf\xe5\xcc:<!\xee\x03\x96[\xf6\xde\xe0\xfa\xb0}\xfa\xdb\x95\x9eio\xba\xc8Oo\xc4^_\x12\x88V\xe5\x0c\x01\x07\x87{\xfc\x93,h\x94\xc1\x80\x96\xac6\xdf\x98+M\xd6\xd0\xcf\x15\xd6>H\x11)\x140\xf7\x12t[\x1a\xa7\xcc\x80v\x18<\xb7\xafOa;o\xf4\x86K\xcf\xe6\x87\xaa\xaaLfk\xc7w \x7fNk\xc0\x9f\xc8b\x1aFo\x80\x07 YRa\x96\xa6\xbcH\x84)SK\xda\xaeX\xbd\x82\x8d6\x11U6d\x91\xb101I\x17\xe0\xe7\xf0\xcc\xd7\x1a@t\xe4\\\x06]\x19\x975\xa2(\xc3\x13\xe3^my\xbe<\xe0\x05\xb8Cue\x9c\x18o3\xe9\xd4-\x10\x14\x9ea\xad\xcb\xd2\xee\xaa\xa0>re\x8a\xb9\x1d\xba\xd2\xb81[\xe7\xd19\xf5\x12\xfe~\xf4\xc5)\x15\xe0o\x01%?#\x94\xde\xa9\xc3g(WDN9\xd8\xeb\xb4\xef8?\xf6\x18\xbdu\x16\x8c"\xbe?c\xb7P\xd1V\x8d\x14\x94\xb8\xaa\xac,=\x81g\xd7G\xac\xf6\x84\xe8\x90\x7f\xce\x1crz@\x9e\xaf\xed\xa1\xb2@\x91\x8c\x89\xe6\xa8\xa5\x9c|\x1cq\xb0|1\x06\xe6\x87\xfcn3\x80\xc2\xb0\x8c\x0cI"\x1c48yC\xe2.\x7f\x7f"k\xbb\xae\xf5a/\xfa\x9f\n\x01\x00\xc7\xb9\xb0C\xff\xb6Y)\xf5a)5`\xf9iqx\xe03Z\xf0\x0bW\x0e\xa7\t\xb4\x98J\xf6\xe2\xa4\xaa\x1eG\xeeD\xe1\xadD\xbe\xfb\r/\x97v\x86j~\xbe\x9d\xf4F\xc0:$\x8a\x06n\x12`sE\xd4\xdc\xe5i\x1a$^\xd4\x06r\x87-bj9Ik[\ru\x8f\xb3q\xb9Y\xc1\xa6\xe8\xb3\xd8)'

def e(m, k):
r = []
r += [m[0] ^ (sum(k) & 0o377)]
for _, i in enumerate(m[1:]):
k = e(k, [m[_]])
r += [i ^ (sum(k) & 0o377)]
return bytes(r)
print("This is a simple python flag checking service.")
flag = input("Please give the flag to check: ")
k = [(a*b) & 0xff for a, b in zip(map(sum, inspect.getsource(main).encode().splitlines()),
map(len, inspect.getsource(main).encode().splitlines()))]
try:
exec(marshal.loads(e(c, k)))
except:
print("That is not the flag")





c = b'\x87\xfcA@\xc7\xc4\xea\xf5\xa6\x87\x84\x02\xd6\x9e\x85\x93\xdeM\xa9\xe7\'\xf1\xaf\xe7\xc5\xde:\xff\xff\x95\x9a\xce\x05v\xd21\xce~\xa5\xb6\x19KI\xafd\xf2\xb5D\x1d\xa9:<7\x97<\xc8\xfd\x02\x9fK\x9a\x14\xb3\xc8\xb82\x90\x1a7\x140j\xffw\xe6\xb1s\xcd|s\xfd\x99\xf4b\xe1Z\x9e\x86\xf1%q\x05\xf0\xfb\xd2\xf0G\xd5x\xc0A\xac\xc4\xe5\xca~}2\x8e.\x9d6\xbe\xe2\x9a\xa0u=\xe0\x98\xaa\xc1xl\x1aI~T\xec\xfe\x95F\xbbS1)\x7f\x01\xdam\xb7>\x91\xf0\xb9-"1\xa1V\xf4\x18{3\'\x8b\x16\xeb\x92%\r<\xbe\xe3\xda\xcc\xc1\x03\xae\xf7h\xe6\xd7\xa8h\xe4\x1dM\xf53.-o\xd7\xb4\x1b\xdd\x1f\x7fG\xeb[o\xbab\x1fZF\xa1\xbd\x81\xe5\xb3)\xdf\'\x01\xdb\xe0j\xd6\xf6\x8b+\x1b\xee\x97\xcb\x9c\xf7\x03\x00p\xdb\xe89}\xc8\xd6\xd2Tu\x85y\x08\xfa\xe2\x98\xd2\xfa\n\x00v\xd4\x0cr\x02ew\x99\xe6\xe2\x1b\x8b\xbd]\x08\xb2\x07\xdfg\xc2\xf3\xd32\xe65\xf1\xa4\x02:\xbe\xf6\xa4\xea\xe1\xc9 \xa4E\x9c\xe3\xf95\x81\xbdd\xb3&\xf7%\x8a\x05\x18\x1a\xdc\x00\x08\xd2\x95\xd8\x06\xc7\xe4\xfaI\xe5\x80K\x99\xfa\xd9\x8a\xc5d\x18\x03\xc6\xd4\x13m4\xf1ts\x866\xe0\xae8$\xb0z\x85\x0bU\xfdC\xe6\xc2\xef:Ra\xd2\x07h\xdf\x9b\xaa\xd8\xa3\xc1\xee}\x0b\xd0\x97\xb7\x11U\x98\x89E\x88\xfd\xa8\x85\x84Ez@\x92U\x8a6\xcb\x18\xb7\xe0$\xfe\xa6\x0f]\xbd\x05p\xc4\xa8"\xc0w\xd7I\xfd\x84\xe8\xb5\xa7\xc9A\x01\tV\xbb\xaa@HTiK\xab)W\xb3\xdf\x0e\xb0\xd8\x93Oh`\xf7[b\xbaB\x8f\xe2\x9d\tpXA\x11\x04\xa2N\x9e;\x07J\x9c@"\x90^9\xdc\x10\x87`9\xbe\xfc|\x04\xb6"\x95\xd7l\xf4\x07;\xfb\x8a\xf3\xc4\xd6\xa2T\xcc\x18v~y8RE\xca,Q\xf5\xb5\xed\xd6,6\xf1i%\x92\xc3\x83\xda\xdc-\x0fWe&/I\x04\x1e\xf4Y\x14]\xb3e\x97\x84\xe1\x922\xd0\x96e\xc2\x161\xebtr\xe8\xa3\xea(\x18!\x83\xf9\x0b+\xc1\x01\x1f\xcec\x1f\x91\xf2\xd8f\xbav\xf9\t\xd7\xab\xd4\x84\x10L\x95\xe7\xf5\xcf\x15\xdf\x9d\xad\xfa\xac\x9d\xcbJ\x86\x14^P\n\xbc\xbd\x1f\xbb\xaen\xe4\xd0q\xc0\xd8\xb3\x97\xdc\x92P\xaa\xe4j\x813~\xd0_q\x88y\xff[\x00\xaa@\x90\x87\x905\xb0\xc3\r\x91\t\x9f>\xdd\x17\x19\xe1.\x8eR\x06/\x99\x1b\xff\x8a\x95qY\xa3h\x10\xcau\x0c\x0b\xb8\xb5\x13\xf6\xde\x06\x9c\xb6\xffS\x819\x8e8\'\x1e\x0fker\xbcD\xc99\x9d\xda\x8b\xbd\x0e\x9cbF?\xe8,\x17w\x8d\xafk\xee\'\x7f\x9b\x07\x91{I\xd0\xbbi$\xf8\xad\xed\xcf\x83\xb8\xee\xbe\x8aM\xa3Ea\xe5\xe3s\xaf\xe5\xcc:<!\xee\x03\x96[\xf6\xde\xe0\xfa\xb0}\xfa\xdb\x95\x9eio\xba\xc8Oo\xc4^_\x12\x88V\xe5\x0c\x01\x07\x87{\xfc\x93,h\x94\xc1\x80\x96\xac6\xdf\x98+M\xd6\xd0\xcf\x15\xd6>H\x11)\x140\xf7\x12t[\x1a\xa7\xcc\x80v\x18<\xb7\xafOa;o\xf4\x86K\xcf\xe6\x87\xaa\xaaLfk\xc7w \x7fNk\xc0\x9f\xc8b\x1aFo\x80\x07 YRa\x96\xa6\xbcH\x84)SK\xda\xaeX\xbd\x82\x8d6\x11U6d\x91\xb101I\x17\xe0\xe7\xf0\xcc\xd7\x1a@t\xe4\\\x06]\x19\x975\xa2(\xc3\x13\xe3^my\xbe<\xe0\x05\xb8Cue\x9c\x18o3\xe9\xd4-\x10\x14\x9ea\xad\xcb\xd2\xee\xaa\xa0>re\x8a\xb9\x1d\xba\xd2\xb81[\xe7\xd19\xf5\x12\xfe~\xf4\xc5)\x15\xe0o\x01%?#\x94\xde\xa9\xc3g(WDN9\xd8\xeb\xb4\xef8?\xf6\x18\xbdu\x16\x8c"\xbe?c\xb7P\xd1V\x8d\x14\x94\xb8\xaa\xac,=\x81g\xd7G\xac\xf6\x84\xe8\x90\x7f\xce\x1crz@\x9e\xaf\xed\xa1\xb2@\x91\x8c\x89\xe6\xa8\xa5\x9c|\x1cq\xb0|1\x06\xe6\x87\xfcn3\x80\xc2\xb0\x8c\x0cI"\x1c48yC\xe2.\x7f\x7f"k\xbb\xae\xf5a/\xfa\x9f\n\x01\x00\xc7\xb9\xb0C\xff\xb6Y)\xf5a)5`\xf9iqx\xe03Z\xf0\x0bW\x0e\xa7\t\xb4\x98J\xf6\xe2\xa4\xaa\x1eG\xeeD\xe1\xadD\xbe\xfb\r/\x97v\x86j~\xbe\x9d\xf4F\xc0:$\x8a\x06n\x12`sE\xd4\xdc\xe5i\x1a$^\xd4\x06r\x87-bj9Ik[\ru\x8f\xb3q\xb9Y\xc1\xa6\xe8\xb3\xd8)'
k = [117, 167, 0, 48, 34, 58, 159, 220, 195, 70, 136, 149, 48, 125, 238]

# if __name__ == "__main__":
# main()



def dump_pyc(fname, code):
import importlib
pyc_data = importlib._bootstrap_external._code_to_timestamp_pyc(code)
with open(fname, 'wb') as f:
f.write(pyc_data)

# code = marshal.loads(e(c, k))
# pyc_data = importlib._bootstrap_external._code_to_timestamp_pyc(code)
# print(pyc_data)
# with open('dump.pyc', 'wb') as f:
# f.write(pyc_data)


def e_old(m, k):
r = []
r += [m[0] ^ (sum(k) & 0o377)]
for _, i in enumerate(m[1:]):
k = e_old(k, [m[_]])
r += [i ^ (sum(k) & 0o377)]
return bytes(r)

I = locals()
l = dict(I)
i = marshal.dumps
l2 = str([dir(_) for _ in l.values()]).encode()

def e(m):
return bytes([a ^ b for a, b in zip(m, m[len(m) // 2:])])

l2 = b'P\xa6wA\xea([\x9f\x98\xde\x1d\xf7D\x86/\xd4\xeb\xc9\xf0+F\xc3\x94\xc4\x9dn\x95\xa1\xe2\xaa\xf5\xfd\x808\xdbF.x\t\xfa\xd9\x1c\x81\x86y\xc8\xf1j\xed\x83\xbe\xd9\xc4\xb6N\xa7\xdbK\xe9e,\xf0SU\xa2:\x88}P\xca3\xff\xf3\x80\x01\x8a\xcb\x1a\xb2)\xdeM\x89|,\xfc>\xb18TV\x9fy\xeb\x97\xddf\t\xe4\x05\x11\xb0\x1d|y\xb2\xa7G\xe6\xa2-\xf2\xcd\x8b&\xc5d\x91Rg/h\x7f\x7f$\xf0\x08\xda;\xfc\x8d\xaa\xb7;\x91Eq,\xf6X\x19 \xc2\xae\x7f\x8ba\x1e\xcd_\xff\x1aA\xfd\xd52=\xd0\xec\xa5\xa5\xe1\xb4\xcf\xb8\xd2i\xa2X\x15\xd7\x80\x14\xe3\xe9\xa4\x06QG\x89B\xd7u\xc2\xb0\x80\xe1\xfd.\xbb\x88\x9f\xde\x07\x1c\x91\xd6\x7f \xf0ag[\xa7\x1d\xd92?m\xb5r\x84\xa3zh\x84\xc9\xe8\x9a\xf1-\xb4\xfe=j\xf0\xeb\xf62\x99\r\\\x16Q;M\xcb\r5(J\xd1\r+j\x11\x9e!P\xd0\xbb\xf5\xdd\xefJ\xe0f9.\xf6}\xc6+\x998\x9c\xb5\xcd1\xa0\x01\x08\r\x89^$\x88\x89\xc78\xbd\xdbL\xcb\x8c8\x16v\xfe\x05{S\xa3q\xe0@\xa1\xda\xb0\x00\xb2\x0c\x18\xf2\xe7\xb6\x81\t\n\x9c\x9c\x93\xcaz\x99kq\x8f\x15\xf6W\xd5\xcc}\x9a\xca\xc8\xa0\xda\xfe\xa1\xae7\xad\xd1\x1e\xd5\xd5#hS\xc7|\x01\n\xe0\xcdS\xe9&\x01\xe6h\xff*\x06\xc4\x8e\x0b\xddP\x8fa9\xa4E\x1a\x90\xfb$\x11\xf8FvV\x83Pg\xdbu\x9f`\xe8\x17\x0e?o\xb3\rU\xbbv\x8a\x07\xe7\xae\xc5Ho\xe3da\xf3\n\xd2]\xddZ\x9bWY\x9e\xea\xb9D\xbe\xb61\xb4\xab\xff\'\x92;\xa6\xe2k\xaa\x19\xdc\x8f\x02\x14W\'\xcdL\xe1\xbe\xdf\x1eJ\xb514\xec4\xcb\x94/\x87}\xea{\x8ev\x1fiJ\'\xc5\xdf\xdc\xad\xf24\x82\na\xf1\xf7\xe9vM\x08;|\xca\xfa\x89 \x17\xfdrQP\x8eOe\x1d\xdcV\x00\xee\xe9\x1b\x83E\xe2\xcbi\xfc$]\xa2\xb1\x1c&\x11\xe1\x14\x15c\xfe\x18\xaf6\x7f\xb9\xd0\'\xdbM\xe8\xf7\x87\xba\x1f\xde\xca\xf0\x17\x0e\xe4\xc0\x11\xb3\x8c<\xe7f6\x93\x9a\xdb\xe0q \x91\xb8\x16\xbd\xd1lX8(\x16]\x913s|\xa5\xd3}U\x92\x01\x95\xdb\x13\'.\xa2\xe8\xfbXq\xb0\x16uB\x06\x912\x8aQ@\x82\x89\xd7\xea\xac\x9b>(G\xe7\x8e\xf2>\x18\x85\xd2P\x84`\x9f\xcd\xb7\r\x1aE\x95\xc9\xac\x1e\xee\x9b\x95\xa4B\x13\xd4\xc7k\xe1 Q\x85\xf6P\xba4\xa9*\xb6\xac\xde\x8f\xa9\xb6Z\x06i>\x98\x8bK\x1eg=\r\x92\x0c}\x94\xc34\xb1\xa8\xf4\x06\r&\x8d"\r\xcdH\xfb\xc4\x85XMSc7}\xdc>\xa0\x0e0A\xe4\x01\x13\xe5Bo\xdd-\xcbA9\xb7\xf6!\x12\x9b\x05\xa5\xe0\x18\xadQ^\xf6\xa5\xd1\xd2\xc5\xe7\x1c\xcbZ\x1a1bXa^\xef\'l\xc5\xf7\xc4\xb54\x1a\xda\x1c\x06\x93\xfd\xe0\xf1\xf3_>vFF\x7fVi.\x8fP;V\xed\x08\xfd\xce\xbc\xb7G\xaa\xedq\xd5 \x1a\x9e8^\xdd\xb8\x87\x07`<\xcf\xd7z+\xf3\x16\x00\x00\x00t\x00|\x00\x83\x01\\\x02}\x01}\x02d\x01\xa0\x01|\x01\xa1\x01S\x00\xf3f\x00\x00\x00g\x00}\x02|\x02|\x00d\x01\x19\x00t\x00|\x01\x83\x01d\x02@\x00A\x00g\x017\x00}\x02t\x01|\x00d\x03d\x00\x85\x02\x19\x00\x83\x01D\x00]\x17\\\x02}\x03}\x04\x88\x00|\x01|\x00|\x03\x19\x00g\x01\x83\x02}\x01|\x02|\x04t\x00|\x01\x83\x01d\x02@\x00A\x00g\x017\x00}\x02q\x17t\x02|\x02\x83\x01S\x00'
l2 = e(e(e(e(e(l2) + e(i(open('chall.py').read()))))))
e2 = open('chall.flag', 'rb')
I = b''
while True:
i = e2.read(3)
if (i := int.from_bytes(i, 'big')) == 0:
break
I += l['e_old'](e2.read(i), l2)
l2 = l['e_old'](l2, l2)

x = marshal.loads(I)
dump_pyc('dump2.pyc', x)

# exec(marshal.loads(I))

运行即可得到 dump2.pyc 然后对其进行反编译得到 dump2.py 进而拿到:
1
2
3
4
5
if flag.encode() == bytes(loads(b'(I117\nI111\nI102\nI116\nI99\nI116\nI102\nI123\nI109\nI48\nI100\nI49\nI102\nI121\nI49\nI110\nI54\nI95\nI55\nI104\nI51\nI95\nI53\nI48\nI117\nI114\nI99\nI51\nI95\nI48\nI102\nI95\nI112\nI121\nI55\nI104\nI48\nI110\nI95\nI49\nI53\nI95\nI102\nI117\nI110\nI125\nt.')):
print('Congratz!! Now submit that flag')
else: # inserted
print('That is not the flag')
main(flag)

最后用 pickle 还原原文:
1
2
3
4
import pickle
d = b'(I117\nI111\nI102\nI116\nI99\nI116\nI102\nI123\nI109\nI48\nI100\nI49\nI102\nI121\nI49\nI110\nI54\nI95\nI55\nI104\nI51\nI95\nI53\nI48\nI117\nI114\nI99\nI51\nI95\nI48\nI102\nI95\nI112\nI121\nI55\nI104\nI48\nI110\nI95\nI49\nI53\nI95\nI102\nI117\nI110\nI125\nt.'

print(bytes(pickle.loads(d)))

即可拿到 flag