Binary
200 points
Retrospective
Reverse it.
file
SECCON{LEGACY_VB_ …
tkmru
kkrnt
mzyy94
COMのAPIコールを眺めると、キーとして入力した文字を切り出している部分を発見。
SECCON{
と}
で分けてカッコの中身を取り出し、その中の文字列を_
で切り分けている。
文字列を一文字ずつ比較し、Failするとエラーダイアログを出す。
アンダーバーで切り分けられた最初の文字列は6文字単位で見られている。
アンダーバーが2個以上ないと文字列判定にすら行かない。
文字列をアンダーバーで切り分けたら6つずつ、順番を入れ替えて文字を見ている。
VarCmpとVarOrの戻り値が判定基準になっている様子。
あたいの大小がわかるから2分探索で解けそう。
とおもったら2セクション目から計算が入って無事死んだ。😇
VB6で書かれたバイナリ
便利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_403B7A: FFreeVar var_A4 = ・・・
フラグ生成してるとこだけ切り取って再コンパイルしたい