SlideShare a Scribd company logo
1 of 73
Download to read offline
LightningTalk
2018年08月29日に投稿 4views
SECCON Beginners CTF 2018 write-up
crackme
1
LightningTalk
[Reversing] crackme
crackme という拡張子のないファイルが配られる
2
LightningTalk
とりあえず何のファイルか確認
3
LightningTalk 4
64bit ELFファイルでした
LightningTalk
とりあえず objdump してみる
5
LightningTalk 6
LightningTalk 7
c言語をコンパイルしたのではなく
直接アセンブリを書いたっぽい
LightningTalk
イマイチよくわからないので
ida で開けばわかるはず
8
LightningTalk 9
LightningTalk 10
ここにたどり着けば flag がわかるので、
上から一つづつ命令を見ていく
LightningTalk 11
LightningTalk
フラグレジスタの値が 0 なら jmp する
12
LightningTalk
cmp は第一オペランドと第二オペランドの引き算を実行し、
その結果に基づきフラグをセットします
13
LightningTalk
[rbp+var_4] - 2 = 0
14
LightningTalk
main関数の引数は呼び出し元で次のように
レジスタに設定されます
argc -> edi
argv -> rsi
15
LightningTalk
argc が 2 なら jmp するので、引数を 1つ渡せば良い
16
LightningTalk 17
LightningTalk
フラグレジスタの値が 0 以外なら jmp する、
要するにフラグレジスタが 0 なら flag が出てくる
18
LightningTalk
test は 2つのオペランドのAND計算を実行し、
その結果に基づきフラグをセットします
19
LightningTalk
eax & eax = 0
20
LightningTalk
つまり eax の値が 0 ならば flag が出てくる
21
LightningTalk
0x601050 を eax に mov しているので
0x601050 が 0 ならば flag が出てくる
22
LightningTalk
次に 2つの call 命令があるので中身を見てみる
23
LightningTalk
1つ目の call 命令
24
LightningTalk
2つ目の call 命令
25
LightningTalk
とりあえず 1つ目の call から見る
26
LightningTalk 27
LightningTalk
0x601050 に 1 を mov している場所があるので
その前の命令を見てみる
28
LightningTalk
フラグレジスタが 0 ならば mov されない
29
LightningTalk
edx と eax を比較して 0 ならば良い
30
LightningTalk
実際に gdb でレジスタの中身を動的に見てみる
31
LightningTalk 32
LightningTalk
flag は必ず ctf4b から始まるので試しに入れてみる
33
LightningTalk
c = 0x63
edx と eax の中身が入力された値 0x63 ではなく
0x9c だったので純粋に比較しているだけではなさそう
34
LightningTalk
次に関係のない文字列を引数として与えて
どちらが入力された値で、
どちらが正解の値か見てみる
35
LightningTalk
edx が変化していて eax が変化していないので、
eax に何が入っているかを調べれば答えが見つかりそう
36
LightningTalk 37
値を単純に比較していないのでどこかで
ビット操作している可能性が高い
LightningTalk 38
詳しく見ていこう
LightningTalk
edx と eax を xor している場所があるので
レジスタの中身を見てみる
39
LightningTalk 40
edx の中身は引数に与えた文字の 0x41 なので、
eax と xor する前は元の文字だった
A = 0x41
LightningTalk 41
xor した後のレジスタの中身を見ると
cmp のときの値と一致している
LightningTalk
edx は cmp まで変わっていないのがわかる
42
LightningTalk
次に edx と xor してる eax の中身を探る
43
LightningTalk
0x601048 の中身を eax に格納している
movzx は 0 拡張して転送だから気にしなくて良い
44
LightningTalk
下位に 2 bitのみにし edx と xor をしている
45
LightningTalk
なので 0x601048 と edx で xor しているのとほぼ同じになる
46
LightningTalk
つまり 0x601048 と eax で xor した値が flag なのでは?
47
LightningTalk
複雑なので一旦図にします
48
LightningTalk 49
edx eax
LightningTalk 50
edx eax
edx eax
LightningTalk 51
edx eax
edx eax
LightningTalk 52
edx eax
edx eax
eax 0x601048
LightningTalk 53
edx eax
edx eax
eax 0x601048
LightningTalk 54
edx eax
edx eax
eax 0x601048
eax
LightningTalk
0x601048 と eax を xor した値を gdb で見てみる
55
LightningTalk
予想通り 0x63 と表示されている
56
LightningTalk
cmp 命令の場所で 0x601048 と eax を xor した値が
flag の1文字なので、全ての cmp 命令のアドレスに
ブレイクポイントを指して、出てきた値を
引数に与えれば flag が出るはず
57
LightningTalk
1つ目の call 命令の中から、cmp 命令のアドレスを全て探す
58
LightningTalk
2つ目の call 命令の中から、cmp 命令のアドレスを全て探す
59
LightningTalk
gdb-peda$ b *0x400819
gdb-peda$ b *0x400869
gdb-peda$ b *0x4008B9
gdb-peda$ b *0x400909
gdb-peda$ b *0x400649
gdb-peda$ b *0x400699
gdb-peda$ b *0x400703
gdb-peda$ b *0x400753
60
探したアドレス全てにブレイクポイントを指す
LightningTalk
gdb-peda$ disp/c *0x601048^$eax
61
disp で 0x601048 と eax を xor した値を画面に出力
LightningTalk
run で実行
62
LightningTalk 63
LightningTalk 64
LightningTalk
Tera Term の log を取ったので実行結果を見る
65
LightningTalk 66
LightningTalk 67
LightningTalk
出てきた値を全てまとめる
68
LightningTalk 69
LightningTalk
出てきた16進数をリトルエンディアンに直し
echo で crackme に投げれば勝利
70
echo -n "x63x74x66x34x62x7bx44x30x5fx79
x30x75x5fx6cx21x6bx33x5fx78x38x36x5fx34
x73x73x65x6dx62x6cx79x3fx7d" | xargs ./crackme
LightningTalk 71
LightningTalk 72
ctf4b{D0_y0u_l!k3_x86_4ssembly?}
LightningTalk 73
ゼオスTTのブログ SECCON Beginners CTF 2018 write-up
Linuxでx86アセンブラ(条件分岐編)
x86-64プロセッサのスタックを理解する
Linuxでx86アセンブラ(論理演算編)

More Related Content

What's hot

言語処理系入門€10
言語処理系入門€10言語処理系入門€10
言語処理系入門€10Kenta Hattori
 
katagaitai CTF勉強会 #5 Crypto
katagaitai CTF勉強会 #5 Cryptokatagaitai CTF勉強会 #5 Crypto
katagaitai CTF勉強会 #5 Cryptotrmr
 
10分で作るクラスライブラリ
10分で作るクラスライブラリ10分で作るクラスライブラリ
10分で作るクラスライブラリ_norin_
 
Abusing Interrupts for Reliable Windows Kernel Exploitation (ja)
Abusing Interrupts for Reliable Windows Kernel Exploitation (ja)Abusing Interrupts for Reliable Windows Kernel Exploitation (ja)
Abusing Interrupts for Reliable Windows Kernel Exploitation (ja)inaz2
 
Inside casper
Inside casperInside casper
Inside casperzigen
 
katagaitaictf7_hw_ysk
katagaitaictf7_hw_yskkatagaitaictf7_hw_ysk
katagaitaictf7_hw_yskysk256
 
FPGAで作るOpenFlow Switch (FPGAエクストリーム・コンピューティング 第6回) FPGAX#6
FPGAで作るOpenFlow Switch (FPGAエクストリーム・コンピューティング 第6回) FPGAX#6FPGAで作るOpenFlow Switch (FPGAエクストリーム・コンピューティング 第6回) FPGAX#6
FPGAで作るOpenFlow Switch (FPGAエクストリーム・コンピューティング 第6回) FPGAX#6Kentaro Ebisawa
 
法政大学情報科学部 2012年度コンピュータネットワーク-第12回授業-Web公開用
法政大学情報科学部 2012年度コンピュータネットワーク-第12回授業-Web公開用法政大学情報科学部 2012年度コンピュータネットワーク-第12回授業-Web公開用
法政大学情報科学部 2012年度コンピュータネットワーク-第12回授業-Web公開用Ruo Ando
 

What's hot (11)

Zynq+PyCoRAM(+Debian)入門
Zynq+PyCoRAM(+Debian)入門Zynq+PyCoRAM(+Debian)入門
Zynq+PyCoRAM(+Debian)入門
 
Rust-DPDK
Rust-DPDKRust-DPDK
Rust-DPDK
 
言語処理系入門€10
言語処理系入門€10言語処理系入門€10
言語処理系入門€10
 
katagaitai CTF勉強会 #5 Crypto
katagaitai CTF勉強会 #5 Cryptokatagaitai CTF勉強会 #5 Crypto
katagaitai CTF勉強会 #5 Crypto
 
10分で作るクラスライブラリ
10分で作るクラスライブラリ10分で作るクラスライブラリ
10分で作るクラスライブラリ
 
Abusing Interrupts for Reliable Windows Kernel Exploitation (ja)
Abusing Interrupts for Reliable Windows Kernel Exploitation (ja)Abusing Interrupts for Reliable Windows Kernel Exploitation (ja)
Abusing Interrupts for Reliable Windows Kernel Exploitation (ja)
 
Inside casper
Inside casperInside casper
Inside casper
 
ret2libc
ret2libcret2libc
ret2libc
 
katagaitaictf7_hw_ysk
katagaitaictf7_hw_yskkatagaitaictf7_hw_ysk
katagaitaictf7_hw_ysk
 
FPGAで作るOpenFlow Switch (FPGAエクストリーム・コンピューティング 第6回) FPGAX#6
FPGAで作るOpenFlow Switch (FPGAエクストリーム・コンピューティング 第6回) FPGAX#6FPGAで作るOpenFlow Switch (FPGAエクストリーム・コンピューティング 第6回) FPGAX#6
FPGAで作るOpenFlow Switch (FPGAエクストリーム・コンピューティング 第6回) FPGAX#6
 
法政大学情報科学部 2012年度コンピュータネットワーク-第12回授業-Web公開用
法政大学情報科学部 2012年度コンピュータネットワーク-第12回授業-Web公開用法政大学情報科学部 2012年度コンピュータネットワーク-第12回授業-Web公開用
法政大学情報科学部 2012年度コンピュータネットワーク-第12回授業-Web公開用
 

Similar to SECCON Beginners CTF 2018 write-up crackme

ELFの動的リンク
ELFの動的リンクELFの動的リンク
ELFの動的リンク7shi
 
Windowsのパケットモニタ作成
Windowsのパケットモニタ作成Windowsのパケットモニタ作成
Windowsのパケットモニタ作成Shinichi Hirauchi
 
Open-FCoE_osc2011tokyofall_20111119
Open-FCoE_osc2011tokyofall_20111119Open-FCoE_osc2011tokyofall_20111119
Open-FCoE_osc2011tokyofall_20111119metamd
 
High Performance Networking with DPDK & Multi/Many Core
High Performance Networking with DPDK & Multi/Many CoreHigh Performance Networking with DPDK & Multi/Many Core
High Performance Networking with DPDK & Multi/Many Coreslankdev
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)Takeshi Yamamuro
 
Kobe.R #15 - Incanter チョットシッテル
Kobe.R #15 - Incanter チョットシッテルKobe.R #15 - Incanter チョットシッテル
Kobe.R #15 - Incanter チョットシッテルtnoda
 
「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」
「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」
「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」直久 住川
 
Trema day 1
Trema day 1Trema day 1
Trema day 1ykuga
 
LLILUM and TinyCLR OS
LLILUM and TinyCLR OSLLILUM and TinyCLR OS
LLILUM and TinyCLR OSAtomu Hidaka
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8y_taka_23
 
VPP事始め
VPP事始めVPP事始め
VPP事始めnpsg
 
Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版Takuya Matsunaga
 
4章 Linuxカーネル - 割り込み・例外 2
4章 Linuxカーネル - 割り込み・例外 24章 Linuxカーネル - 割り込み・例外 2
4章 Linuxカーネル - 割り込み・例外 2mao999
 
ニコニコを支える Erlang / Elixir
ニコニコを支える Erlang / Elixirニコニコを支える Erlang / Elixir
ニコニコを支える Erlang / Elixirkojingharang
 
C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1信之 岩永
 
並列対決 Elixir × Go × C# x Scala , Node.js
並列対決 Elixir × Go × C# x Scala , Node.js並列対決 Elixir × Go × C# x Scala , Node.js
並列対決 Elixir × Go × C# x Scala , Node.jsYoshiiro Ueno
 
【学習メモ#4th】12ステップで作る組込みOS自作入門
【学習メモ#4th】12ステップで作る組込みOS自作入門【学習メモ#4th】12ステップで作る組込みOS自作入門
【学習メモ#4th】12ステップで作る組込みOS自作入門sandai
 
Lxc cf201207-presen
Lxc cf201207-presenLxc cf201207-presen
Lxc cf201207-presenKouhei Maeda
 
Wiresharkの解析プラグインを作る ssmjp 201409
Wiresharkの解析プラグインを作る ssmjp 201409Wiresharkの解析プラグインを作る ssmjp 201409
Wiresharkの解析プラグインを作る ssmjp 201409稔 小林
 

Similar to SECCON Beginners CTF 2018 write-up crackme (20)

ELFの動的リンク
ELFの動的リンクELFの動的リンク
ELFの動的リンク
 
Windowsのパケットモニタ作成
Windowsのパケットモニタ作成Windowsのパケットモニタ作成
Windowsのパケットモニタ作成
 
Docker入門 OSC 2018 Tokyo/Spring
Docker入門 OSC 2018 Tokyo/SpringDocker入門 OSC 2018 Tokyo/Spring
Docker入門 OSC 2018 Tokyo/Spring
 
Open-FCoE_osc2011tokyofall_20111119
Open-FCoE_osc2011tokyofall_20111119Open-FCoE_osc2011tokyofall_20111119
Open-FCoE_osc2011tokyofall_20111119
 
High Performance Networking with DPDK & Multi/Many Core
High Performance Networking with DPDK & Multi/Many CoreHigh Performance Networking with DPDK & Multi/Many Core
High Performance Networking with DPDK & Multi/Many Core
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
 
Kobe.R #15 - Incanter チョットシッテル
Kobe.R #15 - Incanter チョットシッテルKobe.R #15 - Incanter チョットシッテル
Kobe.R #15 - Incanter チョットシッテル
 
「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」
「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」
「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」
 
Trema day 1
Trema day 1Trema day 1
Trema day 1
 
LLILUM and TinyCLR OS
LLILUM and TinyCLR OSLLILUM and TinyCLR OS
LLILUM and TinyCLR OS
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
 
VPP事始め
VPP事始めVPP事始め
VPP事始め
 
Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版
 
4章 Linuxカーネル - 割り込み・例外 2
4章 Linuxカーネル - 割り込み・例外 24章 Linuxカーネル - 割り込み・例外 2
4章 Linuxカーネル - 割り込み・例外 2
 
ニコニコを支える Erlang / Elixir
ニコニコを支える Erlang / Elixirニコニコを支える Erlang / Elixir
ニコニコを支える Erlang / Elixir
 
C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1
 
並列対決 Elixir × Go × C# x Scala , Node.js
並列対決 Elixir × Go × C# x Scala , Node.js並列対決 Elixir × Go × C# x Scala , Node.js
並列対決 Elixir × Go × C# x Scala , Node.js
 
【学習メモ#4th】12ステップで作る組込みOS自作入門
【学習メモ#4th】12ステップで作る組込みOS自作入門【学習メモ#4th】12ステップで作る組込みOS自作入門
【学習メモ#4th】12ステップで作る組込みOS自作入門
 
Lxc cf201207-presen
Lxc cf201207-presenLxc cf201207-presen
Lxc cf201207-presen
 
Wiresharkの解析プラグインを作る ssmjp 201409
Wiresharkの解析プラグインを作る ssmjp 201409Wiresharkの解析プラグインを作る ssmjp 201409
Wiresharkの解析プラグインを作る ssmjp 201409
 

SECCON Beginners CTF 2018 write-up crackme