テストファイル:https://adworld.xctf.org.cn/media/task/attachments/088c3bd10de44fa988a3601dc5585da8.exe
1.準備
情報へのアクセス
- 32個のファイル
- コンパス圧縮シェル(NSPack)
1.砲撃
1.1 ODオープン(ESPの法則法)
WordやDWordのことができます
ライン上で[OK]をクリックします。
私たちは次のウェルにブレークポイントするように、ブレークポイントまで実行し、直接F9ことができます。
プラグインの砲撃をOllyDump選択します。
その上にファイルの名前を変更します。
1.2ソフトウェアの砲撃法
これは、ライン上の砲撃に巻き込まについて特に何もありません
しかし、この方法は、ファイルが破損しているという欠点がありました
あなたはImportREC修復を使用することができます
2.IDAオープン
1 INT __cdeclメイン(int型 ARGC、CONST チャー ** ARGV、CONST チャー ** envpを) 2 { 3 int型の結果。// EAX 4 int型の V4。// EAX 5 文字 BUF。// [ESP + 4H] [EBP-38H] 6 チャーのDst。// [ESP + 5H] [EBP-37H] 7 8 BUF = 0 。 9 のmemset(&Dstの、0、0x31u )。 10 のprintf("入力してくださいフラグ:" ); 11 gets_s(&BUF、0x2Cu )、 12 であれば(STRLEN(&BUF)== 42 ) 13 { 14 V4 = 0 ; 15 ながら((*(&BUF + V4の)^ byte_402130 [V4の%16 ] )== dword_402150 [V4]) 16 { 17 であれば(++ V4> = 42 ) 18 { 19 のprintf(" 右\ N!" ); 20 後藤LABEL_8; 21 } 22 } 23 のprintf(" エラー\ n個!" ); 24 LABEL_8: 25 結果= 0 。 26 } 27 他の 28 { 29 のprintf(" エラー\ N!" )。 30 結果= - 1 。 31 } 32 リターン結果。 33 }
3.コード分析
第二ラインによって42、フラグ42の長さを知ることができます
15ラインにより、我々は[V4]、配列の添字V4は41の最大である入力は[V4%16] XOR等しいdword_402150 byte_402130正しいフラグであることを知っています
。nsp0:00402130 byte_402130デシベル' トン' ; DATA XREF:_main:loc_40107Fの↑rを 。nsp0:00402131 aHisIsNotFlagデシベル' his_is_not_flag '、0
実際には、「this_is_not_flag」
。nsp0:00402150 dword_402150 ddと12hと 、DATA XREF:_main + 8D↑R 。nsp0:00402154 DD 4、8、14時間、24時間、5CH、4AH、3DH、56H、0AH、10H、67H、0 。nsp0:00402184 DD 41hを、0 。nsp0:0040218Cの DD 1 、46H、5AH、44H、42H、6EH、0CH、44H、72時間、0CH、0DH 。nsp0:0040218C用 のDD 40H、3EH、4BH、5FH、2、1 、4Chの、5EH、5BH、17H、6EH、0CH 。nsp0:0040218C用 のDD 16H、68H、5BH、12H、2 DUP(0 ) 。nsp0:00402200 DDの48時間、名0EhのDUP(0 ) 。nsp0:0040223Cは dword_403000オフセットDD 。nsp0:00402240は dword_4022B0オフセットDD 。nsp0:00402244 DD 1 、53445352h、41D713B4h、4CDD5318h、12DCFFBAh、0D5AF8709h 。nsp0:00402244 DD 1
このデジタルは、実際に42を必要としています。
3.スクリプトを取得します
byte_402130 = " this_is_not_flag " dword_402150 = 0x12を、4、8、0x14に、0x24を、0x5Cを、0x4A、0x3D、0x56、は0x0A、0x10の、0x67 、 0、 0×41、0、1、0x46の、0x5A、0x44の、0x42に、0x6E、 0x0Cの、0x44の、0x72、0x0Cの、0x0Dの、 0x40の、0x3E、0x4B、0x5F、2、1、0x4C、0x5Eの、0x5B、0x17の、0x6E、0x0Cの、0x16、0x68 、 0x5B、0x12を、0、0、0x48 ] X = '' のための I における範囲(0,42 ): X + = CHR(dword_402150 [I] ^ ORD(byte_402130 [I%16 ])) プリント(X)
4.getフラグ!
フラグ{59b8ed8f-af22-11e7-bb4a-3cf862d1ee75}