--- lang: ja-jp breaks: true --- Retrospective === ## 問題概要 ### ジャンル Binary ### 点数 200 points ### 問題文 Retrospective Reverse it. file ### フラグ SECCON{LEGACY_VB_ ... ### 挑戦者 tkmru kkrnt mzyy94 ## 解法 ## 議論 COMのAPIコールを眺めると、キーとして入力した文字を切り出している部分を発見。 `SECCON{`と`}`で分けてカッコの中身を取り出し、その中の文字列を`_`で切り分けている。 文字列を一文字ずつ比較し、Failするとエラーダイアログを出す。 アンダーバーで切り分けられた最初の文字列は6文字単位で見られている。 アンダーバーが2個以上ないと文字列判定にすら行かない。 ![](https://i.imgur.com/63IxgTR.png) 文字列をアンダーバーで切り分けたら6つずつ、順番を入れ替えて文字を見ている。 ![](https://i.imgur.com/vpNjDOb.png) VarCmpとVarOrの戻り値が判定基準になっている様子。 [VarCmp function (Automation)](https://msdn.microsoft.com/ja-jp/library/windows/desktop/ms221006(v=vs.85).aspx) あたいの大小がわかるから2分探索で解けそう。 とおもったら2セクション目から計算が入って無事死んだ。😇 ![](https://i.imgur.com/nGihg7a.png) VB6で書かれたバイナリ 便利IDC:[https://www.hex-rays.com/products/ida/support/freefiles/vb.idc](https://www.hex-rays.com/products/ida/support/freefiles/vb.idc) VB6用のツールを使うと以下のようになった. ``` Private Sub Command1_Click() '403F18 'Data Table: 401B9C loc_40390C: FLdRfVar var_94 loc_40390F: FLdPrThis loc_403910: VCallAd Control_ID_Text1 loc_403913: FStAdFunc var_90 loc_403916: FLdPr var_90 loc_403919: = Me.Text loc_40391E: FLdRfVar var_FC loc_403921: FLdPrThis loc_403922: VCallAd Control_ID_Text1 loc_403925: FStAdFunc var_F8 loc_403928: FLdPr var_F8 loc_40392B: = Me.Text loc_403930: FLdRfVar var_8C loc_403933: FLdPrThis loc_403934: VCallAd Control_ID_Text1 loc_403937: FStAdFunc var_88 loc_40393A: FLdPr var_88 loc_40393D: = Me.Text loc_403942: ILdRf var_8C loc_403945: FnLenStr loc_403946: LitI4 8 loc_40394B: LtI4 loc_40394C: CVarBoolI2 var_E4 loc_403950: LitI4 7 loc_403955: FLdZeroAd var_94 loc_403958: CVarStr var_A4 loc_40395B: FLdRfVar var_B4 loc_40395E: ImpAdCallFPR4 = Left(, ) loc_403963: FLdRfVar var_B4 loc_403966: LitVarStr var_C4, "SECCON{" loc_40396B: HardType loc_40396C: NeVar var_D4 loc_403970: OrVar var_F4 loc_403974: LitI4 1 loc_403979: FLdZeroAd var_FC loc_40397C: CVarStr var_10C loc_40397F: FLdRfVar var_11C loc_403982: ImpAdCallFPR4 = Right(, ) loc_403987: FLdRfVar var_11C loc_40398A: LitVarStr var_12C, "}" loc_40398F: HardType loc_403990: NeVar var_13C loc_403994: OrVar var_14C loc_403998: CBoolVarNull loc_40399A: FFree1Str var_8C loc_40399D: FFreeAd var_88 = "": var_90 = "" loc_4039A6: FFreeVar var_A4 = "": var_B4 = "": var_E4 = "": var_10C = "" loc_4039B3: BranchF loc_4039B9 loc_4039B6: Branch loc_403EE3 loc_4039B9: FLdRfVar var_8C loc_4039BC: FLdPrThis loc_4039BD: VCallAd Control_ID_Text1 loc_4039C0: FStAdFunc var_88 loc_4039C3: FLdPr var_88 loc_4039C6: = Me.Text loc_4039CB: LitI4 0 loc_4039D0: LitI4 -1 loc_4039D5: LitVarStr var_C4, "_" loc_4039DA: FStVarCopyObj var_A4 loc_4039DD: FLdRfVar var_A4 loc_4039E0: ILdRf var_8C loc_4039E3: FLdRfVar var_B4 loc_4039E6: ImpAdCallFPR4 = Split(, , , ) loc_4039EB: FLdRfVar var_B4 loc_4039EE: FStVar var_15C loc_4039F2: FFree1Str var_8C loc_4039F5: FFree1Ad var_88 loc_4039F8: FFree1Var var_A4 = "" loc_4039FB: FLdRfVar var_15C loc_4039FE: CRefVarAry loc_403A00: PopAdLd4 loc_403A01: LitI2_Byte 1 loc_403A03: FnUBound loc_403A05: LitI4 2 loc_403A0A: GeI4 loc_403A0B: BranchF loc_403EE3 loc_403A0E: LitVarI2 var_C4, 0 loc_403A13: PopAdLdVar loc_403A14: FLdRfVar var_15C loc_403A17: VarIndexLdRfVarLock loc_403A1F: FStR4 var_418 loc_403A22: LitVarI2 var_180, 0 loc_403A27: PopAdLdVar loc_403A28: FLdRfVar var_15C loc_403A2B: VarIndexLdRfVarLock loc_403A33: FStR4 var_41C loc_403A36: LitVarI2 var_1D4, 0 loc_403A3B: PopAdLdVar loc_403A3C: FLdRfVar var_15C loc_403A3F: VarIndexLdRfVarLock loc_403A47: FStR4 var_420 loc_403A4A: LitVarI2 var_268, 0 loc_403A4F: PopAdLdVar loc_403A50: FLdRfVar var_15C loc_403A53: VarIndexLdRfVarLock loc_403A5B: FStR4 var_424 loc_403A5E: LitVarI2 var_2FC, 0 loc_403A63: PopAdLdVar loc_403A64: FLdRfVar var_15C loc_403A67: VarIndexLdRfVarLock loc_403A6F: FStR4 var_428 loc_403A72: LitVarI2 var_390, 0 loc_403A77: PopAdLdVar loc_403A78: FLdRfVar var_15C loc_403A7B: VarIndexLdRfVarLock loc_403A83: FStR4 var_42C loc_403A86: LitVarI2 var_B4, 1 loc_403A8B: LitI4 8 loc_403A90: ILdRf var_418 loc_403A93: FLdRfVar var_D4 loc_403A96: ImpAdCallFPR4 = Mid(, , ) loc_403A9B: AryUnlock loc_403A9E: FLdRfVar var_D4 loc_403AA1: LitVarStr var_170, "L" loc_403AA6: HardType loc_403AA7: NeVar var_F4 loc_403AAB: LitVarI2 var_11C, 1 loc_403AB0: LitI4 9 loc_403AB5: ILdRf var_41C loc_403AB8: FLdRfVar var_13C loc_403ABB: ImpAdCallFPR4 = Mid(, , ) loc_403AC0: AryUnlock loc_403AC3: FLdRfVar var_13C loc_403AC6: LitVarStr var_1B4, "E" loc_403ACB: HardType loc_403ACC: NeVar var_14C loc_403AD0: OrVar var_1C4 loc_403AD4: LitVarI2 var_218, 1 loc_403AD9: LitI4 &HB loc_403ADE: ILdRf var_420 loc_403AE1: FLdRfVar var_228 loc_403AE4: ImpAdCallFPR4 = Mid(, , ) loc_403AE9: AryUnlock loc_403AEC: FLdRfVar var_228 loc_403AEF: LitVarStr var_238, "A" loc_403AF4: HardType loc_403AF5: NeVar var_248 loc_403AF9: OrVar var_258 loc_403AFD: LitVarI2 var_2AC, 1 loc_403B02: LitI4 &HA loc_403B07: ILdRf var_424 loc_403B0A: FLdRfVar var_2BC loc_403B0D: ImpAdCallFPR4 = Mid(, , ) loc_403B12: AryUnlock loc_403B15: FLdRfVar var_2BC loc_403B18: LitVarStr var_2CC, "G" loc_403B1D: HardType loc_403B1E: NeVar var_2DC loc_403B22: OrVar var_2EC loc_403B26: LitVarI2 var_340, 1 loc_403B2B: LitI4 &HD loc_403B30: ILdRf var_428 loc_403B33: FLdRfVar var_350 loc_403B36: ImpAdCallFPR4 = Mid(, , ) loc_403B3B: AryUnlock loc_403B3E: FLdRfVar var_350 loc_403B41: LitVarStr var_360, "Y" loc_403B46: HardType loc_403B47: NeVar var_370 loc_403B4B: OrVar var_380 loc_403B4F: LitVarI2 var_3D4, 1 loc_403B54: LitI4 &HC loc_403B59: ILdRf var_42C loc_403B5C: FLdRfVar var_3E4 loc_403B5F: ImpAdCallFPR4 = Mid(, , ) loc_403B64: AryUnlock loc_403B67: FLdRfVar var_3E4 loc_403B6A: LitVarStr var_3F4, "C" loc_403B6F: HardType loc_403B70: NeVar var_404 loc_403B74: OrVar var_414 loc_403B78: CBoolVarNull loc_403B7A: FFreeVar var_A4 = "": var_B4 = "": var_D4 = "": var_10C = "": var_11C = "": var_13C = "": var_1F4 = "": var_218 = "": var_228 = "": var_288 = "": var_2AC = "": var_2BC = "": var_31C = "": var_340 = "": var_350 = "": var_3B0 = "": var_3D4 = "" loc_403BA1: BranchF loc_403BA7 loc_403BA4: Branch loc_403EE3 loc_403BA7: LitVarI2 var_C4, 0 loc_403BAC: FStVar var_43C loc_403BB0: LitVarI2 var_180, 0 loc_403BB5: FLdRfVar var_44C loc_403BB8: LitVarI2 var_C4, 1 loc_403BBD: PopAdLdVar loc_403BBE: FLdRfVar var_15C loc_403BC1: VarIndexLdVar loc_403BC7: FnLenVar var_B4 loc_403BCB: LitVarI2 var_12C, 1 loc_403BD0: SubVar var_D4 loc_403BD4: FFree1Var var_A4 = "" loc_403BD7: ForVar var_46C loc_403BDD: LitVarI2 var_C4, 1 loc_403BE2: PopAdLdVar loc_403BE3: FLdRfVar var_15C loc_403BE6: VarIndexLdRfVarLock loc_403BEE: FStR4 var_418 loc_403BF1: FLdRfVar var_43C loc_403BF4: LitVarI2 var_D4, 1 loc_403BF9: FLdRfVar var_44C loc_403BFC: LitVarI2 var_12C, 1 loc_403C01: AddVar var_A4 loc_403C05: CI4Var loc_403C07: ILdRf var_418 loc_403C0A: FLdRfVar var_F4 loc_403C0D: ImpAdCallFPR4 = Mid(, , ) loc_403C12: AryUnlock loc_403C15: FLdRfVar var_F4 loc_403C18: CStrVarVal var_8C loc_403C1C: ImpAdCallI2 Asc() loc_403C21: CVarI2 var_190 loc_403C24: LitVarI2 var_180, 4 loc_403C29: FLdRfVar var_44C loc_403C2C: PwrVar var_10C loc_403C30: MulVar var_11C loc_403C34: AddVar var_13C loc_403C38: FStVar var_43C loc_403C3C: FFree1Str var_8C loc_403C3F: FFreeVar var_B4 = "": var_A4 = "": var_D4 = "" loc_403C4A: FLdRfVar var_44C loc_403C4D: NextStepVar var_46C loc_403C53: FLdRfVar var_43C loc_403C56: LitVarI2 var_C4, 350 loc_403C5B: HardType loc_403C5C: NeVar var_A4 loc_403C60: LitVarI2 var_E4, 1 loc_403C65: PopAdLdVar loc_403C66: FLdRfVar var_15C loc_403C69: VarIndexLdVar loc_403C6F: FnLenVar var_D4 loc_403C73: LitVarI2 var_170, 2 loc_403C78: HardType loc_403C79: NeVar var_F4 loc_403C7D: OrVar var_10C loc_403C81: CBoolVarNull loc_403C83: FFree1Var var_B4 = "" loc_403C86: BranchF loc_403C8C loc_403C89: Branch loc_403EE3 loc_403C8C: FLdRfVar var_43C loc_403C8F: LitVarI2 var_C4, 256 loc_403C94: MulVar var_A4 loc_403C98: FStVar var_43C loc_403C9C: LitVarI2 var_180, 0 loc_403CA1: FLdRfVar var_44C loc_403CA4: LitVarI2 var_C4, 2 loc_403CA9: PopAdLdVar loc_403CAA: FLdRfVar var_15C loc_403CAD: VarIndexLdVar loc_403CB3: FnLenVar var_B4 loc_403CB7: LitVarI2 var_12C, 1 loc_403CBC: SubVar var_D4 loc_403CC0: FFree1Var var_A4 = "" loc_403CC3: ForVar var_48C loc_403CC9: LitVarI2 var_C4, 1 loc_403CCE: PopAdLdVar loc_403CCF: FLdRfVar var_15C loc_403CD2: VarIndexLdRfVarLock loc_403CDA: FStR4 var_418 loc_403CDD: FLdRfVar var_43C loc_403CE0: LitVarI2 var_D4, 1 loc_403CE5: FLdRfVar var_44C loc_403CE8: LitVarI2 var_12C, 1 loc_403CED: AddVar var_A4 loc_403CF1: CI4Var loc_403CF3: ILdRf var_418 loc_403CF6: FLdRfVar var_F4 loc_403CF9: ImpAdCallFPR4 = Mid(, , ) loc_403CFE: AryUnlock loc_403D01: FLdRfVar var_F4 loc_403D04: CStrVarVal var_8C loc_403D08: ImpAdCallI2 Asc() loc_403D0D: CVarI2 var_190 loc_403D10: LitVarI2 var_180, 4 loc_403D15: FLdRfVar var_44C loc_403D18: PwrVar var_10C loc_403D1C: MulVar var_11C loc_403D20: AddVar var_13C loc_403D24: FStVar var_43C loc_403D28: FFree1Str var_8C loc_403D2B: FFreeVar var_B4 = "": var_A4 = "": var_D4 = "" loc_403D36: FLdRfVar var_44C loc_403D39: NextStepVar var_48C loc_403D3F: FLdRfVar var_43C loc_403D42: LitVarI4 loc_403D4A: HardType loc_403D4B: NeVarBool loc_403D4D: BranchF loc_403D53 loc_403D50: Branch loc_403EE3 loc_403D53: LitVarI2 var_C4, 0 loc_403D58: FStVar var_43C loc_403D5C: LitVarI2 var_12C, 0 loc_403D61: FLdRfVar var_44C loc_403D64: FLdRfVar var_8C loc_403D67: FLdPrThis loc_403D68: VCallAd Control_ID_Text1 loc_403D6B: FStAdFunc var_88 loc_403D6E: FLdPr var_88 loc_403D71: = Me.Text loc_403D76: ILdRf var_8C loc_403D79: FnLenStr loc_403D7A: LitI4 1 loc_403D7F: SubI4 loc_403D80: CVarI4 loc_403D84: FFree1Str var_8C loc_403D87: FFree1Ad var_88 loc_403D8A: ForVar var_4AC loc_403D90: FLdRfVar var_8C loc_403D93: FLdPrThis loc_403D94: VCallAd Control_ID_Text1 loc_403D97: FStAdFunc var_88 loc_403D9A: FLdPr var_88 loc_403D9D: = Me.Text loc_403DA2: FLdRfVar var_43C loc_403DA5: LitVarI2 var_D4, 1 loc_403DAA: FLdRfVar var_44C loc_403DAD: LitVarI2 var_C4, 1 loc_403DB2: AddVar var_A4 loc_403DB6: CI4Var loc_403DB8: FLdZeroAd var_8C loc_403DBB: CVarStr var_B4 loc_403DBE: FLdRfVar var_F4 loc_403DC1: ImpAdCallFPR4 = Mid(, , ) loc_403DC6: FLdRfVar var_F4 loc_403DC9: CStrVarVal var_94 loc_403DCD: ImpAdCallI2 Asc() loc_403DD2: CVarI2 var_170 loc_403DD5: LitVarI2 var_12C, 2 loc_403DDA: FLdRfVar var_44C loc_403DDD: PwrVar var_10C loc_403DE1: MulVar var_11C loc_403DE5: AddVar var_13C loc_403DE9: FStVar var_43C loc_403DED: FFree1Str var_94 loc_403DF0: FFree1Ad var_88 loc_403DF3: FFreeVar var_B4 = "": var_A4 = "": var_D4 = "" loc_403DFE: FLdRfVar var_44C loc_403E01: NextStepVar var_4AC loc_403E07: FLdRfVar var_8C loc_403E0A: FLdPrThis loc_403E0B: VCallAd Control_ID_Text1 loc_403E0E: FStAdFunc var_88 loc_403E11: FLdPr var_88 loc_403E14: = Me.Text loc_403E19: FLdRfVar var_43C loc_403E1C: LitVarI4 loc_403E24: HardType loc_403E25: EqVar var_A4 loc_403E29: LitI4 0 loc_403E2E: LitI4 &H80 loc_403E33: FLdZeroAd var_8C loc_403E36: CVarStr var_B4 loc_403E39: FLdRfVar var_D4 loc_403E3C: ImpAdCallFPR4 = StrConv(, , ) loc_403E41: FLdRfVar var_D4 loc_403E44: CVar2Vec loc_403E48: FLdRfVar var_4B0 loc_403E4B: ImpAdCallI2 Proc_2_0_403028() loc_403E50: FStStr var_94 loc_403E53: FLdRfVar var_4B0 loc_403E56: Erase loc_403E57: ILdRf var_94 loc_403E5A: LitStr "8B292F1A-9C4631B3-E13CD49C-64EF7454-0352D0C0" loc_403E5D: EqStr loc_403E5F: CVarBoolI2 var_E4 loc_403E63: AndVar var_F4 loc_403E67: CBoolVarNull loc_403E69: FFree1Str var_94 loc_403E6C: FFree1Ad var_88 loc_403E6F: FFreeVar var_B4 = "": var_D4 = "" loc_403E78: BranchF loc_403EE3 loc_403E7B: FLdRfVar var_94 loc_403E7E: FLdPrThis loc_403E7F: VCallAd Control_ID_Text1 loc_403E82: FStAdFunc var_88 loc_403E85: FLdPr var_88 loc_403E88: = Me.Text loc_403E8D: LitVar_Missing var_F4 loc_403E90: LitVar_Missing var_D4 loc_403E93: LitVarStr var_C4, vbNullString loc_403E98: FStVarCopyObj var_B4 loc_403E9B: FLdRfVar var_B4 loc_403E9E: LitI4 0 loc_403EA3: LitStr "Thank you for your purchase :-) " loc_403EA6: LitStr vbCrLf loc_403EA9: ConcatStr loc_403EAA: FStStrNoPop var_8C loc_403EAD: LitStr "And, " loc_403EB0: ConcatStr loc_403EB1: FStStrNoPop var_FC loc_403EB4: ILdRf var_94 loc_403EB7: ConcatStr loc_403EB8: FStStrNoPop var_4B4 loc_403EBB: LitStr " is Flag." loc_403EBE: ConcatStr loc_403EBF: CVarStr var_A4 loc_403EC2: ImpAdCallFPR4 MsgBox(, , , , ) //イケたときのMsgBox loc_403EC7: FFreeStr var_8C = "": var_FC = "": var_94 = "" loc_403ED2: FFree1Ad var_88 loc_403ED5: FFreeVar var_A4 = "": var_B4 = "": var_D4 = "" loc_403EE0: Branch loc_403F14 loc_403EE3: LitVar_Missing var_F4 loc_403EE6: LitVar_Missing var_D4 loc_403EE9: LitVarStr var_E4, vbNullString loc_403EEE: FStVarCopyObj var_B4 loc_403EF1: FLdRfVar var_B4 loc_403EF4: LitI4 0 loc_403EF9: LitVarStr var_C4, "Sorry, This key is not valid." loc_403EFE: FStVarCopyObj var_A4 loc_403F01: FLdRfVar var_A4 loc_403F04: ImpAdCallFPR4 MsgBox(, , , , ) // ダメだったときのMsgBox loc_403F09: FFreeVar var_A4 = "": var_B4 = "": var_D4 = "" loc_403F14: ExitProcHresult End Sub ``` シリアルのような文字```8B292F1A-9C4631B3-E13CD49C-64EF7454-0352D0C0```があるので入力しようとするが, 入力フォームは28文字までしか受け付けない. バイナリを見ると, 0x2BFBに0x1Cがあるので, そこを書き換えることで任意の文字長を受け付けるように出来る. それで```8B292F1A-9C4631B3-E13CD49C-64EF7454-0352D0C0```を入力したが, incorrect… 入力値を何か処理して, その後```8B292F1A-9C4631B3-E13CD49C-64EF7454-0352D0C0```と```EqStr```してるような感じ? 入力値 → 8B292F1A-9C4631B3-E13CD49C-64EF7454-0352D0C0の処理を見つけて逆実装考えれてそれを満たす入力値を探すって流れ? ここだけ16文字あるしこの前後があやしいか? * loc_403A96:からの処理ゼッタイフラグツクッテルヨ * でも読めん・・・ ``` loc_403B7A: FFreeVar var_A4 = ・・・ ``` フラグ生成してるとこだけ切り取って再コンパイルしたい * してくれ