文字化けプログラムフラグを実行します
IDA開いているビューのプログラム・ロジック
1 INT __cdecl __noreturnメイン(int型 ARGC、CONST チャー ** ARGV、CONST チャー ** envpを) 2 { 3 int型 V3。// ECX 4 CHAR * lpMem。// [ESP + 8H] [EBP-Chの] 5 HANDLE hHeap。// [ESP + 10H] [EBP-4H] 6 7 hHeap = HeapCreate(0x40000u、0、0 ); 8 lpMem =(CHAR *)ます。HeapAlloc(hHeap、8U、unk_409B34 + 1 )。 9 memcpy_s(lpMem、unk_409B34、dword_409B10、unk_409B34)。 10 であれば(sub_40102A()|| IsDebuggerPresent()) 11 { 12 __debugbreak()。 13 sub_401000(V3 + 4、lpMem)。 14
1符号なし整数 __fastcall sub_401000(int型 A1、CHAR * A2) 2 { 3 int型 V2。// ESI 4 のchar * V3。// EAX 5 符号なし整数 V4。// ECX 6 未署名のint型の結果。// EAX 7 8 V2 = dword_409B38。 9 V3 =&A2 [STRLEN(A2 + 1)+ 2 ]。 10 V4 = 0 。 11 結果=((符号なし整数)(V3 - (A2 + 2))>> 2)+ 1 。 12 であれば(結果) 13 { 14が 行う 15 *(_ DWORD *)を&A2 [ 4 * V4 ++] ^ = V2。 16 一方(V4 < 結果)。 17 } 18 リターン結果。 19 }
15件 のExitProcess(0xFFFFFFFFの); 16 } 17 MessageBoxA(0、lpMem + 1、" 旗"、2U )。 18 HeapFree(hHeap、0 、lpMem)。 19 HeapDestroy(hHeap)。 20件 のExitProcess(0 )。 21 }
それは見つけることができます:
アンチデバッグIsDebuggerPresent 1.存在()
2.lpMemもsub_401000に現れ(V3 + 4、lpMem)関数が、この関数が呼び出されません
ダイナミックなデバッグ:
アンチデバッグスキップ、sub_401000関数にジャンプする(デバッグがベースアドレスになりますが、同じことが0x1000のオフセット)
ポップは、元のコールの必要性が第二ポップにジャンプする(プログラムは2つの機能MessageBoxA、トラップ、lpMem第一の出力、第二出力(lpMem + 1)を有している)、すなわちポップ、元の復号しましたオフィス
ラン
フラグ{reversing_is_not_that_hard!}
スクリプトをデコードします:
1 X = [0xbb、0xAAを、0xcc、0xdd ] 2、Y = bytes.fromhex(' BBCCA0BCDCD1BEB8CDCFBEAED2C4AB82D2D993B3D4DE93A9D3CBB882D3CBBEB99AD7CCDD ' ) 3 Z = [] 4 I = 0 5 ながら iが< lenの(Y): 6 T = CHR(Y [I] ^ X [I 4%]) 7 z.append(T) 8 、I + = 1枚の 9 プリント(Z) 10 プリント('' .join(Z))
[ '\のX00'、 'F'、 'L'、 ''、 'G'、 '{'、R ''、 'E'、 'V'、 'E'、 'R'、 'S'、 '私は、' H」、 'T'、 '_'、 'N'、 'G'、 '_'、 'i'は、 'S'、 '_'、 'N'、 'O'、 'T' 」、 ''、 'T'、 '_'、 'H'、 ''、R ''、 'D'、 '!'、 '}'、 '\ X00'、 '\ X00']
フラグ{ reversing_is_not_that_hard!}
ここでは、最初の文字が、「\ 0」としてストレートカットをデコードした後、それは出力が空白になるので、なぜ、最初のポップが失敗します呼び出す見ることができます