世界csaw2013reversing2のCSAWのCTF 2014年に攻防

文字化けプログラムフラグを実行します

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(0x40000u00 );
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」としてストレートカットをデコードした後、それは出力が空白になるので、なぜ、最初のポップが失敗します呼び出す見ることができます

 

おすすめ

転載: www.cnblogs.com/DirWang/p/11420740.html