銀行が推奨している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;
    int modifier = 0x4e4;
    for(int i = 0; i < sz; i++){
        current_char = cs[i];
        cs[i] = (char)(current_char ^ (modifier >> 8));
        modifier += current_char;
        modifier *= 0xCE6D;
 
;       modifier += 0x58BF;
        modifier %= 0x10000;
    }
    cs[i]=0xd; //改行を末尾に追加
    cs[i+1]=0xa;
    zz =fwrite(cs, 1,sz+2,fw);

    }while(1);
    fclose(fs);
    fclose(fw);

試しに復号ソフト作ってみたらこんな感じ。

先週、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いじれるか調べてたから面白いログが出てるね・ω・

韓国 Ahnlab V3 製品の Log の暗号解除をアプリにしてみた

おすすめ

2件のフィードバック

  1. 名無し より:

    これはどうしようもないな
    こんなんでハッキングとか騒がれたら
    騒いだ奴の技術の低さに笑いますね

  2. 黒翼猫 より:

    そーですね、暗号の復号と整合性チェックのAPIまで提供して、低レベルの解析で攻撃用のスクリプトかけちゃうような韓国のソフト使っちゃってるんだからどうしよもないですね(棒)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です