TL;DR §
- PickleバイトコードでPythonのコードオブジェクトを構築しながらフラグをチェックする
- co_argcountとco_codestring以外は固定でこれらをSETITEMSオペコードを実行してセットしたものをNEWOBJオペコードでインスタンス化している
- 構築されるコードオブジェクトにもいくらかの難読化が施されている
- co_consts や co_names が空: 定数等が変数として使えないため、引数の数値同士を除算、減算する形で1や0を作ってそこを起点に他の数値も強引に作っている
- co_varnamesが全てクエスチョン (
"?"
) になっている
- 構築されるコードオブジェクトとその引数を取得して動作を逆アセンブラと気合で解析し、フラグを逆算する
- (突然の宣伝) 筆者は既にPickle動的解析用のフレームワークを書いているのでそれで命令をフックして取得した