銀行が推奨しているSaAT Netizenのログの暗号を解除してみた
日本の 都市・地方銀行で採用されている韓国製SaAT NetizenにSwiftKeyと同じ脆弱性
多くの都市銀行で採用されている韓国製SaAT Netizenをハッキングできるか実験してみた
ネタがないんで、さらに V3Hunt.dll をいじって遊んでみました。
V3Hunt.DLL を解析してみたところ 5.5.0.4 の場合オフセット 0x36D6 にログ出力関数があることが分かりました
LogOutPut(Bool Flag, char *vptr, vlist *vlist)
SUB_L100036D6: push ebp mov ebp,esp mov eax,00002244h call SUB_L10009050 cmp dword ptr [L100188AC],FFFFFFFFh push esi jz L10003858 cmp dword ptr [ebp+0Ch],00000000h // Log 自体出力しない jz L10003858 cmp dword ptr [ebp+08h],00000000h // Debugger に出力するフラグ jnz L10003729 lea eax,[ebp+10h] push eax lea eax,[ebp-00001244h] push [ebp+0Ch] push eax call SUB_L10008FFA add esp,0000000Ch lea eax,[ebp-00001244h] push eax call [KERNEL32.dll!OutputDebugStringA] jmp L10003858 L10003729: push ebx lea eax,[ebp+10h] push edi push eax push [ebp+0Ch] lea eax,[ebp-00001244h] push eax call SUB_L10008FFA lea eax,[ebp-0Ch] push eax call SUB_L10008F76 lea eax,[ebp-18h] push eax call SUB_L10008EFD add esp,00000014h lea eax,[ebp-00001244h] push eax lea eax,[ebp-18h] push eax lea eax,[ebp-0Ch] push eax call [KERNEL32.dll!GetCurrentProcessId] push eax lea eax,[ebp-00002244h] push SSZ10018914___ld___s__s__s push eax call SUB_L10008EAB // プロセス情報と日時を付加 lea eax,[ebp-00002244h] push eax call SUB_L10008E30 push 000004E4h // Key lea ecx,[ebp-00002244h] push eax push ecx mov [ebp+08h],eax push eax lea eax,[ebp-00001244h] push eax call SUB_L1000385B mov esi,[USER32.dll!wsprintfA] add esp,00000030h mov ebx,L1001C95C mov edi,SSZ1001890C__s__s push SSZ10018900_supdate_log push ebx lea eax,[ebp-00000140h] push edi push eax call esi lea eax,[ebp-3Ch] push eax lea eax,[ebp-00000140h] push eax call SUB_L10008AFC mov eax,[ebp-28h] add esp,00000018h cmp eax,[L100188AC] jc L10003814 push SSZ100188F0_supdate2_log push ebx lea eax,[ebp-00000244h] push edi push eax call esi add esp,00000010h lea eax,[ebp-00000244h] push 00000000h push eax lea eax,[ebp-00000140h] push eax call [KERNEL32.dll!CopyFileA] push L100188EC jmp L10003819 L10003814: push L100188E8 L10003819: lea eax,[ebp-00000140h] push eax call SUB_L10008A31 pop ecx mov esi,eax pop ecx pop edi test esi,esi pop ebx jz L10003858 push esi push 00000001h lea eax,[ebp+08h] push 00000004h push eax call SUB_L100088C7 push esi push 00000001h push [ebp+08h] lea eax,[ebp-00001244h] push eax call SUB_L100088C7 push esi call SUB_L1000884A add esp,00000024h L10003858: pop esi leave retn |
ざっとこんな感じですね。 解析時間は5分ほど。
水色のところが暗号化してる所なので、呼び出し先の SUB_L1000385B を以下のように書き換えます
SUB_L1001518A: push ebp mov ebp,esp push [ebp+10h] push [ebp+08h] call [KERNEL32.dll!lstrcpyA] leave retn |
[7700] 03/07/16 19:57:39 __GetUpdateData(Sec=AOS,Type=0x0004,OS=0x0002,CP=0x03a4,Flag=0x00000000) [7700] 03/07/16 19:57:41 __GetUpdateData(Sec=AOS,Type=0x0004,OS=0x0002,CP=0x03a4,Flag=0x00000000) |
はい。生のLogデータ出てきました。
暗号化してるところは、どうやら
SUB_L10008030 の様です。
(char *target, DWORD size, ); こんな感じかな?
push [ebp+0Ch] push 00000000h push edi call SUB_L10008030 add esp,0000000Ch cmp dword ptr [ebp+14h],00000000h jle L100038BC mov ecx,edi sub esi,edi mov edi,[ebp+14h] L10003895: mov al,[esi+ecx] xor edx,edx mov dl,[ebp+19h] xor al,dl mov edx,000058BFh mov [ecx],al movzx ax,al add eax,[ebp+18h] imul eax,00003193h sub edx,eax inc ecx dec edi mov [ebp+18h],edx jnz L10003895 L100038BC: xor eax,eax jmp L100038C3 L100038C0: |
for (DWORD i = 0; i < nInLen; i ++) { pOutBuf[i] = pInBuf[i] ^ (key >> 8) & 0xFF; key = 0x58BF - (pOutBuf[i] + key) * 0x3193; } |
ソースはこうなりますね。ハッシュかけてるだけ
赤字の部分つぶせば暗号化阻止できるようです・ω・
そこで、暗号化済みのファイルも復号するソフト書いてみましょう
FILE *fs; FILE *fw; DWORD sz,zz; BYTE *cs; fs=fopen(input_file,"rb"); fw=fopen(output_file, "wb"); do{ zz = fread(&sz, 1,4,fs); if(zz==0)break; cs= new BYTE[sz+4]; zz = fread(cs, 1,sz,fs); if(zz==0)break; long current_char; }while(1); |
試しに復号ソフト作ってみたらこんな感じ。
先週、Netizen 本体いじってた時のログを復号してみた
[13608] 03/03/16 17:47:22 [V3HUNT][CheckFileCRC()] (ahn.ui : 0x925710E4) != 0xC8E588B3(File C:\Users\Mofmo\AppData\Local\Temp\saaC83A.tmp\Netizen_Setup.exe) [11312] 03/03/16 17:51:24 __GetUpdateData(Sec=AOS,Type=0x0004,OS=0x0002,CP=0x03a4,Flag=0x00000000) [11312] 03/03/16 17:52:47 __GetUpdateData(Sec=AOS,Type=0x0004,OS=0x0002,CP=0x03a4,Flag=0x00000000) [11312] 03/03/16 17:52:48 [V3HUNT][CheckFileCRC()] (ahn.ui : 0x925710E4) != 0x3B826DBB(File C:\Users\Mofmof\AppData\Local\Temp\saaC3C.tmp\Netizen_Setup.exe) [14900] 03/03/16 17:56:22 __GetUpdateData(Sec=AOS,Type=0x0004,OS=0x0002,CP=0x03a4,Flag=0x00000000) [14900] 03/03/16 17:58:25 __GetUpdateData(Sec=AOS,Type=0x0004,OS=0x0002,CP=0x03a4,Flag=0x00000000) [19780] 03/03/16 18:00:03 __GetUpdateData(Sec=AOS,Type=0x0004,OS=0x0002,CP=0x03a4,Flag=0x00000000) [19780] 03/03/16 18:00:03 GetUpdateData2:CRCerr [19780] 03/03/16 18:00:04 __GetUpdateData(Sec=AOS,Type=0x0004,OS=0x0002,CP=0x03a4,Flag=0x00000000) |
CRCいじれるか調べてたから面白いログが出てるね・ω・
これはどうしようもないな
こんなんでハッキングとか騒がれたら
騒いだ奴の技術の低さに笑いますね
そーですね、暗号の復号と整合性チェックのAPIまで提供して、低レベルの解析で攻撃用のスクリプトかけちゃうような韓国のソフト使っちゃってるんだからどうしよもないですね(棒)