Upgrade to Pro — share decks privately, control downloads, hide ads and more …

なぜマルウェア解析は自動化できないのか

 なぜマルウェア解析は自動化できないのか

セキュリティ・キャンプ全国大会2016 講義資料

Yuma Kurogome

August 14, 2016
Tweet

More Decks by Yuma Kurogome

Other Decks in Programming

Transcript

  1. View Slide

  2. View Slide

  3. View Slide

  4. View Slide

  5. View Slide















  6. View Slide





  7. View Slide















  8. View Slide














  9. View Slide

  10. View Slide































  11. View Slide







  12. View Slide

  13. typedef struct _IMAGE_OPTIONAL_HEADER
    {
    WORD Magic;
    ...
    DWORD SizeOfCode; // コード全体のサイズ
    ...
    DWORD AddressOfEntryPoint; // エントリポイントのアドレス (RVA)
    DWORD BaseOfCode; // コード領域のベースアドレス (RVA)
    DWORD BaseOfData; // グローバル変数などの値が確定していないデータ領域のベースアドレス (RVA)
    DWORD ImageBase; // 仮想メモリにロードされるときの開始(ベース)アドレス
    // RVAはImageBaseのアドレスを引いた相対アドレス
    ...
    DWORD SizeOfImage; // メモリにロードされたときの全体サイズ
    DWORD SizeOfHeaders;
    ...
    IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
    // インポート情報やエクスポート情報などへのアドレス (RVA)
    } IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;

    View Slide

  14. View Slide







  15. View Slide

  16. View Slide








  17. View Slide









  18. View Slide





  19. View Slide


  20. MOV EBX, EAX
    ADD EAX, $0x4

    MOV EBX, EAX
    ADD EAX, $0x4




    mov_i32 ebx, eax
    movi_i32 tmp1, 0x4
    add_i32 eax, tmp1

    View Slide


  21. View Slide


  22. View Slide

  23. View Slide

  24. View Slide










  25. View Slide




  26. View Slide






  27. View Slide






  28. View Slide

  29. View Slide






  30. View Slide







  31. View Slide

  32. • •

    View Slide









  33. View Slide

  34. from datetime import date
    from hashlib import sha256
    def dyre_dga(num, date_str=None):
    if None == date_str:
    date_str = '{0.year}-{0.month}-{0.day}'.format(date.today())
    tlds = ['.cc', '.ws', '.to', '.in', '.hk', '.cn', '.tk', '.so']
    hash = sha256('{0}{1}'.format(date_str, num)).hexdigest()[3:36]
    replace_char = chr(0xFF & ((num % 26) + 97))
    return '{0}{1}{2}:443'.format(replace_char, hash, tlds[num % len(tlds)])
    todays_domains = [dyre_dga(i) for i in xrange(333)]

    View Slide





  35. View Slide



  36. View Slide




  37. View Slide

  38. View Slide

  39. View Slide










  40. View Slide





  41. View Slide



  42. View Slide

  43. cmp eax, 0x7E0
    je 0xdeadbaad
    if(x!=2016) Invalid.
    ASSERT( INPUT_*_*_* =0hex7E0 );
    (a1 or !a2 or a3 … or an)
    and (b1 or b2 or !b3 … or !bn)
    and …

    View Slide

  44. View Slide



  45. View Slide


  46. View Slide

  47. View Slide



  48. View Slide

  49. View Slide


  50. View Slide

  51. View Slide







  52. View Slide




  53. View Slide