プロジェクト

全般

プロフィール

CTF Pwn » 履歴 » バージョン 19

kanata, 2025/09/20 17:39

1 1 kanata
# CTF Pwn
2
3 4 kanata
{{last_updated_at}}
4
5 1 kanata
むぅ。攻撃手法について、ぜんぜん体系化できん。。もうちょっと理解が必要だ。
6
7
{{toc}}
8
9
# Linuxにおけるソフトウェアの脆弱性とセキュリティ機構まとめ
10
11
がんばって整理してみる。
12
13 6 kanata
![fig01.png](fig01.png)
14
15
16 1 kanata
17 6 kanata
18 9 kanata
19 1 kanata
### Pwnable の流れ
20
21
ユーザからの入力は、ローカル変数(stack)、グローバル変数(.data、もしくは、.bss)、ヒープ領域(heap)のいずれかに格納される。
22
23
| C言語における変数の種類  | 格納される領域       | 格納される方向                         |
24
|--------------------------|----------------------|----------------------------------------|
25
| ローカル変数             | stack                | アドレスの値が大きいほうから小さい方へ |
26
| グローバル変数           |.data、もしくは、.bss | アドレスの値が小さいほうから大きい方へ |
27
| malloc関数で確保した領域 | heap                 | アドレスの値が小さいほうから大きい方へ |
28
29
もし仮に、 Stack buffer over flow の脆弱性があった場合、ユーザからの入力はローカル変数で定義したサイズを超えて、stack内のメモリ領域を書き換える事ができる。
30
書き換える内容を工夫することで、以下ができる。
31
32
* 他の領域(heapや.bss等々)を読みこんだり書き換えたりできる。
33
* プログラムの流れを変え、任意の命令を実行できる。
34
35
# Linux kernelのメモリ管理
36
37
## 全セクション
38
39
調査方法
40
41
~~~
42
# readelf -S /bin/ls
43
~~~
44
45
~~~
46
# gdb /bin/ls
47
(gdb) b exit
48
(gdb) r
49
(gdb) i files
50
(gdb) i proc
51
(gdb) shell cat /proc/[PID]/maps
52
~~~
53
54
| セクション名     | 開始アドレス(サンプル)| NX bit | 説明 |
55
|------------------|-----------------------|--------|------|
56
| .interp          | 0x00400238 | r-xp | 実行形式のロードと動的リンクを行う共有ライブラリ(/lib64/ld-linux-x86-64.so.2とか)を指定 [ゆずさん研究所](http://d.hatena.ne.jp/yz2cm/20131012/1381610473)
57
| .note.ABI-tag    | 0x00400254 | r-xp | このセクションは、何らかの方法でファイルに印をつける情報を保持している [ゆずさん研究所](http://d.hatena.ne.jp/yz2cm/20131013/1381614214)
58
| .note.gnu.build-id| 0x00400274 | r-xp | ビルドされたファイルに対するユニークなIDが入っている。core dumpに含まれる [わらばんし仄聞記](http://warabanshi.hatenablog.com/entry/2013/05/18/231628)
59
| .gnu.hash        | 0x00400298 | r-xp | シンボル名の検索を高速化するための .dynsym に関連付けられたハッシュテーブル[ゆずさん研究所](http://d.hatena.ne.jp/yz2cm/20131013/1381662391)
60
| .dynsym          | 0x004002d0 | r-xp | 動的リンク用のシンボルテーブル。[わらばんし仄聞記](http://warabanshi.hatenablog.com/entry/2013/05/18/231628) [ゆずさん研究所](http://d.hatena.ne.jp/yz2cm/20131014/1381702665)
61
| .dynstr          | 0x00400f30 | r-xp | .dynsymセクションヘッダのsh_nameが参照する文字列(シンボル名)を格納している [わらばんし仄聞記](http://warabanshi.hatenablog.com/entry/2013/05/18/231628) [ゆずさん研究所](http://d.hatena.ne.jp/yz2cm/20131014/1381705567)
62
| .gnu.version     | 0x004014ec | r-xp | .dynsymで定義されるシンボルに対応するバージョンの一覧 [わらばんし仄聞記](http://warabanshi.hatenablog.com/entry/2013/04/11/040554)
63
| .gnu.version_r   | 0x004015f8 | r-xp | .gnu.versionが指すバージョン値についての情報が示されているセクション [わらばんし仄聞記](http://warabanshi.hatenablog.com/entry/2013/05/18/231628)
64
| .rela.dyn        | 0x00401688 | r-xp | リロケータブルなシンボルを dynamic に解決するためのセクション [新千葉 ガーベージ・コレクション](http://ryos36.hatenablog.com/entry/20100922/1285145438)
65
| .rela.plt        | 0x00401760 | r-xp | 動的リンクのために書き替えが必要なアドレスのリスト。アドレスとシンボルをペアにして関連付けている [七誌の開発日記](http://7shi.hateblo.jp/entry/2013/05/25/103050) [わらばんし仄聞記](http://warabanshi.hatenablog.com/entry/2013/05/18/231628)
66
| .init            | 0x00402228 | r-xp | このセクションにはプロセスが実行される前に実行される実行可能な命令が格納されます。プログラムの実行が始まるときに、OSはメインプログラムエントリー(C言語ではmain関数)をコールする前にこのセクションのコードを実行します。
67
| .plt             | 0x00402250 | r-xp | 遅延リンクのために使われる。関数本体へのジャンプコードの集合 [わらばんし仄聞記](http://warabanshi.hatenablog.com/entry/2013/05/18/231628)
68
| .text            | 0x00402990 | r-xp | プログラムのうち、機械語の部分を格納するためのセクション
69
| .fini            | 0x0041295c | r-xp | プロセスの実行終了時に実行される実行可能な命令が格納される。プログラムが正常終了するときにOSはこのセクションのコードを実行する。
70
| .rodata          | 0x00412980 | r-xp | プログラムのうち、定数(const)を格納するためのセクション。C言語では、「プログラム中の文字列定数」「const宣言された定数」などが格納される。[セクションとか.textとか](http://www.ertl.jp/~takayuki/readings/info/no02.html)
71
| .eh_frame_hdr    | 0x00416650 | r-xp |  C++のランタイムが eh_frame にアクセスするためのコードが入るセクション [メモ書き](http://nsaito-nmiri.hateblo.jp/entry/2015/05/22/201534)
72
| .eh_frame        | 0x00416d98 | r-xp | 例外をサポートしている言語の場合、情報を保持しておくセクション。バックトレース(スタックトレース)をとるための情報が入ったフレーム [わらばんし仄聞記](http://warabanshi.hatenablog.com/entry/2013/05/18/231628)
73
| .init_array      | 0x0061a320 | r--p | 関数のアドレスが格納された配列になっている。.initセクション実行の後に、順番に実行される。
74
| .fini_array      | 0x0061a328 | r--p | 関数のアドレスが格納された配列になっている。.finiセクション実行よりも前に、順番に実行される。
75
| .jcr             | 0x0061a330 | r--p | Java Class Reference らしい。
76
| .data.rel.ro     | 0x0061a340 | r--p | RELRO関係??
77
| .dynamic         | 0x0061ada8 | r--p | 動的リンクに必要な情報を集めたテーブル
78
| .got             | 0x0061afa8 | r--p | 動的リンクされた関数などのアドレステーブル。ここをインタプリタで書き替えることにより、動的リンクを実現する。
79
| .got.plt         | 0x0061b000 | rw-p | 動的リンクされた関数などのアドレステーブル。ここを書き替えることにより、動的リンクを実現する。Full RELROの場合は、存在しない。 [七誌の開発日記](http://7shi.hateblo.jp/entry/2013/05/25/103050)
80
| .data            | 0x0061b3c0 | rw-p | プログラムのうち、初期値を持つ変数を格納するためのセクション。C言語では、「0以外の初期値を持つ大域変数」「0以外の初期値を持つ静的局所変数」がここに置かれる。データとして初期値を持ち、プログラムローダは書き込み可能なメモリを確保した後、初期値を書き込む。
81
| .bss             | 0x0061b600 | rw-p | プログラムのうち、初期値を持たない変数を格納するためのセクション。C言語では、「初期値が指定されない大域変数」「初期値が0の大域変数」「初期値が指定されない静的局所変数」「初期値が0の静的局所変数」が格納される。C言語の規約では、「この領域はすべて0で初期化されなければならない」と規定されているため、プログラムローダは書き込み可能なメモリを確保した後、すべて0で初期化する。
82
| [heap]↓         | 0x0061c000-0x0063e000     | rw-p     | C言語におけるmalloc関数等で確保した領域が配置される
83
| shared-object    | 7ffff0415000-7ffff7ffa000 | 以下参照 | 共有ライブラリ(.soのファイル)のメモリ配置場所
84
| [vdso]           | 7ffff7ffa000-7ffff7ffc000 | r-xp     | ここ([[CTF Pwn#vDSO - 仮想 ELF 動的共有オブジェクトの概要]])参照
85
| shared-object    | 7ffff7ffc000-7ffff7fff000 | 以下参照 | 共有ライブラリ(.soのファイル)のメモリ配置場所
86
| [stack]↑        | 7ffffffea000-7ffffffff000 | rw-p     | C言語における関数呼び出し元のアドレス退避先、及び、ローカル変数のメモリ配置先
87
| [vsyscall]       | ffffffffff600000-ffffffffff601000 | r-xp |  カーネル空間の実行コードをユーザ空間から参照できる [int0x80 と sysenter を切り替える vsyscall](https://github.com/hiboma/hiboma/blob/master/Linux%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E8%A7%A3%E8%AA%AD%E5%AE%A4/Linux%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E8%A7%A3%E8%AA%AD%E5%AE%A4-5-3.md)
88
| kernel-area      |  |  | カーネルが使うところ
89
90
> NX bit
91
92
>>r = read
93
>>w = write
94
>>x = execute
95
>>s = shared
96
>>p = private (copy on write)
97
98
> shared-object の NX bit の例 (soによって中身が4分割されてNX bitを設定されたり、まちまち)
99
100
~~~
101
7ffff0415000-7ffff693c000 r--p 00000000 fd:00 181108739                  /usr/lib/locale/locale-archive
102
7ffff693c000-7ffff6952000 r-xp 00000000 fd:00 72515859                   /usr/lib64/libpthread-2.17.so
103
7ffff6952000-7ffff6b52000 ---p 00016000 fd:00 72515859                   /usr/lib64/libpthread-2.17.so
104
7ffff6b52000-7ffff6b53000 r--p 00016000 fd:00 72515859                   /usr/lib64/libpthread-2.17.so
105
7ffff6b53000-7ffff6b54000 rw-p 00017000 fd:00 72515859                   /usr/lib64/libpthread-2.17.so
106
7ffff6b54000-7ffff6b58000 rw-p 00000000 00:00 0 
107
7ffff6b58000-7ffff6b5c000 r-xp 00000000 fd:00 72518875                   /usr/lib64/libattr.so.1.1.0
108
7ffff6b5c000-7ffff6d5b000 ---p 00004000 fd:00 72518875                   /usr/lib64/libattr.so.1.1.0
109
7ffff6d5b000-7ffff6d5c000 r--p 00003000 fd:00 72518875                   /usr/lib64/libattr.so.1.1.0
110
7ffff6d5c000-7ffff6d5d000 rw-p 00004000 fd:00 72518875                   /usr/lib64/libattr.so.1.1.0
111
7ffff6d5d000-7ffff6d60000 r-xp 00000000 fd:00 72515794                   /usr/lib64/libdl-2.17.so
112
7ffff6d60000-7ffff6f5f000 ---p 00003000 fd:00 72515794                   /usr/lib64/libdl-2.17.so
113
7ffff6f5f000-7ffff6f60000 r--p 00002000 fd:00 72515794                   /usr/lib64/libdl-2.17.so
114
7ffff6f60000-7ffff6f61000 rw-p 00003000 fd:00 72515794                   /usr/lib64/libdl-2.17.so
115
116
117
118
~~~
119
120 19 kanata
ハッカーが見るメモリの世界 スタック・ヒープ・text・data・bssを解説
121
https://whitemarkn.com/penetrationtest/memory-map/
122
123 1 kanata
ELFの動的リンク
124
http://www.slideshare.net/7shi/startprintf2-elf
125
126
Github - torvalds/linux/Documentation/x86/x86_64/mm.txt
127
https://github.com/torvalds/linux/blob/master/Documentation/x86/x86_64/mm.txt
128
129
Linux メモリ管理を理解したい
130
https://qiita.com/kimullaa/items/998c2599c9f51bac5be4
131
132
## 主要なセクション
133
134
CTFだけ考えるなら、以下を押さえておけば、だいたいなんとかなる。
135
136
| セクション名     | 開始アドレス(サンプル) | NX bit | ざっくり説明 |
137
|------------------|------------------------|--------|--------------|
138
| .plt             | 0x00402250             | r-xp   | ここ([[CTF Pwn#PLT(Procedure Linkage Table)とGOT(Global Offset Table)]])参照
139
| .text            | 0x00402990             | r-xp   | 実行される機械語のところ
140
| .rodata          | 0x00412980             | r-xp   | プログラム中の文字列定数、const宣言された定数
141
| .got             | 0x0061afa8             | r--p   | ここ([[CTF Pwn#PLT(Procedure Linkage Table)とGOT(Global Offset Table)]])参照 
142
| .got.plt         | 0x0061b000             | rw-p   | ここ([[CTF Pwn#PLT(Procedure Linkage Table)とGOT(Global Offset Table)]])参照。Full RELROの場合は、存在しない。
143
| .data            | 0x0061b3c0             | rw-p   | 初期値を持つ変数
144
| .bss             | 0x0061b600             | rw-p   | 初期値を持たない変数
145
| [heap]↓         | 0x0061c000-0x0063e000  | rw-p   | malloc関数を実行した際のメモリ確保先
146
| shared-object    | 7ffff0415000-7ffff7fff000         | いろいろ | 共有ライブラリ
147
| [stack]↑        | 7ffffffea000-7ffffffff000         | rw-p     | 関数呼び出し元のアドレス退避先、ローカル変数のメモリ配置先
148
| kernel-area      |                                   |          |
149
150
## PLT(Procedure Linkage Table)とGOT(Global Offset Table)
151
152
libc.soなどにある外部関数のアドレスを動的に求める機構。
153
.pltセクションが外部アドレスを解決し、.got.pltに保存(キャッシュ)する。スタティックリンクだと存在しない。
154
155
Partial RELROの場合、遅延バインドという動作になる。
156
共有ライブラリにある関数アドレスに対して、初回呼び出し時に、.got.pltにキャッシュする方式。
157
そのため、.got.pltセクションは書き込み可能な状態で存在し、GOT overwriteという攻撃を受けるリスクがある。
158
159
![fig02.png](fig02.png)
160
161
例えば、C言語でputs関数を呼び出すコーディングをした際の動きは、以下の通り。
162
163
* ①.textセクションにputs関数を呼び出す機械語が書かれている。puts関数の呼び出し先アドレスは、.pltセクションのputs関数がエントリされている部分になる。
164
* ②呼び出された.pltセクションのputs関数の箇所は、さらに .got.pltセクションのputs関数がエントリされているアドレスを呼び出す。
165
* ③.got.pltセクションは、本物の共有ライブラリ(libc.so)のputs関数を呼び出す。
166
167
Full RELROの場合は、.got.pltセクションは存在しない。
168
遅延バインドを使わず、プロセス起動時に外部アドレスを解決して.gotセクションに書き込む。書き込み後にNXによりリードオンリーにする。
169
動きは、.got.pltが、.gotに代わる以外は、Partial RELROの場合と同様である。
170
171
![fig03.png](fig03.png)
172
173
174
175
176
177
PLTエントリはELF中の固定アドレスであり、ASLRが有効であってもアドレスは固定。
178
PIEが適用されている場合はアドレスがランダムとなる。
179
180
### 参考
181
182
ψ(プサイ)の興味関心空間 - ELFの再配置シンボルの解決
183
http://ledyba.org/2014/06/13093609.php
184
185
脱力系日記 GOT、PLTとIAT
186
http://tkmr.hatenablog.com/entry/2017/02/28/030528
187
188
189
190
## vDSO - 仮想 ELF 動的共有オブジェクトの概要
191
192
一部のアーキテクチャの時間関数などは、高速化のためカーネル空間に切り替わらず、vsyscallのみで実現している。
193
vsyscallに必要な関数群をユーザー空間のアプリケーションに提供する仕組み。
194
195
[Man page of VDSO](https://linuxjm.osdn.jp/html/LDP_man-pages/man7/vdso.7.html)
196
197
## スタックとスタックフレームの仕組み
198
199
![fig04.png](fig04.png)
200
201
黄色の部分は SSP による canary値。後述する。
202
203
[ELF Auxiliary Table](http://articles.manugarg.com/aboutelfauxiliaryvectors)
204
要はカーネルから渡される各種値のテーブル。アンチデバッグとして、稀にこの値が利用されることがある。
205 12 kanata
206
# 参考:Mohit Mishra
207
208
{{rawhtml(<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Memory Segmentation Cheatsheet <a href="https://t.co/fI1hX3pxFO">pic.twitter.com/fI1hX3pxFO</a></p>&mdash; Mohit Mishra (@chessMan786) <a href="https://twitter.com/chessMan786/status/1912121847107465628?ref_src=twsrc%5Etfw">April 15, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>)}}
209
210
{{rawhtml(<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Diagram with Each Section and Details to it <a href="https://t.co/H1AaX1FPLv">pic.twitter.com/H1AaX1FPLv</a></p>&mdash; Mohit Mishra (@chessMan786) <a href="https://twitter.com/chessMan786/status/1921939038157865272?ref_src=twsrc%5Etfw">May 12, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>)}}
211
212 18 kanata
{{rawhtml(<blockquote class="twitter-tweet"><p lang="en" dir="ltr">𝐋𝐢𝐧𝐮𝐱 𝐏𝐫𝐨𝐜𝐞𝐬𝐬 𝐌𝐞𝐦𝐨𝐫𝐲 𝐋𝐚𝐲𝐨𝐮𝐭⁣<br>When you run a program on Linux, the operating system sets up a specific structure for its memory. This setup helps manage how the process uses RAM efficiently. <a href="https://t.co/zcn94o6gGK">pic.twitter.com/zcn94o6gGK</a></p>&mdash; Mohit Mishra (@chessMan786) <a href="https://twitter.com/chessMan786/status/1945144579000558053?ref_src=twsrc%5Etfw">July 15, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>)}}
213
214 12 kanata
{{rawhtml(<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Memory Segment <a href="https://t.co/j8abA4T0kB">pic.twitter.com/j8abA4T0kB</a></p>&mdash; Mohit Mishra (@chessMan786) <a href="https://twitter.com/chessMan786/status/1921581295773331667?ref_src=twsrc%5Etfw">May 11, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>)}}
215
216
{{rawhtml(<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Physical vs Virtual Memory Map <a href="https://t.co/fHDsNlsCd6">pic.twitter.com/fHDsNlsCd6</a></p>&mdash; Mohit Mishra (@chessMan786) <a href="https://twitter.com/chessMan786/status/1909255590989451502?ref_src=twsrc%5Etfw">April 7, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>)}}
217
218
{{rawhtml(<blockquote class="twitter-tweet"><p lang="en" dir="ltr">This process repeats continuously, allowing the CPU to execute programs efficiently. <a href="https://t.co/SeHPCUGK9q">pic.twitter.com/SeHPCUGK9q</a></p>&mdash; Mohit Mishra (@chessMan786) <a href="https://twitter.com/chessMan786/status/1921975947739463721?ref_src=twsrc%5Etfw">May 12, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>)}}
219
220
{{rawhtml(<blockquote class="twitter-tweet"><p lang="zxx" dir="ltr"><a href="https://t.co/2NcUtm92VY">pic.twitter.com/2NcUtm92VY</a></p>&mdash; Mohit Mishra (@chessMan786) <a href="https://twitter.com/chessMan786/status/1923381436058386617?ref_src=twsrc%5Etfw">May 16, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>)}}
221
222
{{rawhtml(<blockquote class="twitter-tweet"><p lang="zxx" dir="ltr"><a href="https://t.co/WzwhcfgFVH">pic.twitter.com/WzwhcfgFVH</a></p>&mdash; Mohit Mishra (@chessMan786) <a href="https://twitter.com/chessMan786/status/1923779599084769727?ref_src=twsrc%5Etfw">May 17, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>)}}
223
224 1 kanata
{{rawhtml(<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Normal Stack vs Stack with Buffer Overflow <a href="https://t.co/ZMYMFgIIUq">pic.twitter.com/ZMYMFgIIUq</a></p>&mdash; Mohit Mishra (@chessMan786) <a href="https://twitter.com/chessMan786/status/1923766880688538092?ref_src=twsrc%5Etfw">May 17, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>)}}
225 12 kanata
226
{{rawhtml(<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Amend version with dynamic linking <a href="https://t.co/ciFkvHRxt6">pic.twitter.com/ciFkvHRxt6</a></p>&mdash; Jemmy (@Jemmy__Wong) <a href="https://twitter.com/Jemmy__Wong/status/1923794709685862445?ref_src=twsrc%5Etfw">May 17, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>)}}
227
228 13 kanata
{{rawhtml(<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Kernel Space Network Driver <a href="https://t.co/RRMdjARHLQ">pic.twitter.com/RRMdjARHLQ</a></p>&mdash; Mohit Mishra (@chessMan786) <a href="https://twitter.com/chessMan786/status/1924539286466265123?ref_src=twsrc%5Etfw">May 19, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> )}}
229 1 kanata
230 14 kanata
{{rawhtml(<blockquote class="twitter-tweet"><p lang="en" dir="ltr">When a program runs, it leverages a stack to handle function calls and local variables. The stack, operating on a Last-In-First-Out (LIFO) principle, expands downwards in memory. <a href="https://t.co/AQbcsXHmHX">pic.twitter.com/AQbcsXHmHX</a></p>&mdash; Mohit Mishra (@chessMan786) <a href="https://twitter.com/chessMan786/status/1926535117901537544?ref_src=twsrc%5Etfw">May 25, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> )}}
231
232
{{rawhtml(<blockquote class="twitter-tweet"><p lang="zxx" dir="ltr"><a href="https://t.co/rqvE9Ivkzy">pic.twitter.com/rqvE9Ivkzy</a></p>&mdash; Mohit Mishra (@chessMan786) <a href="https://twitter.com/chessMan786/status/1926614486263247065?ref_src=twsrc%5Etfw">May 25, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> )}}
233
234
{{rawhtml(<blockquote class="twitter-tweet"><p lang="zxx" dir="ltr"><a href="https://t.co/wmoaSOZN7E">pic.twitter.com/wmoaSOZN7E</a></p>&mdash; Mohit Mishra (@chessMan786) <a href="https://twitter.com/chessMan786/status/1926155276006072675?ref_src=twsrc%5Etfw">May 24, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> )}}
235
236 15 kanata
{{rawhtml(<blockquote class="twitter-tweet"><p lang="zxx" dir="ltr"><a href="https://t.co/KVbEfIsuNp">pic.twitter.com/KVbEfIsuNp</a></p>&mdash; Mohit Mishra (@chessMan786) <a href="https://twitter.com/chessMan786/status/1928094314334175398?ref_src=twsrc%5Etfw">May 29, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>)}}
237 14 kanata
238 16 kanata
{{rawhtml(<blockquote class="twitter-tweet"><p lang="en" dir="ltr">How Linux Organizes Virtual Memory <a href="https://t.co/RWFCe1DAHH">pic.twitter.com/RWFCe1DAHH</a></p>&mdash; Mohit Mishra (@chessMan786) <a href="https://twitter.com/chessMan786/status/1928652519858692580?ref_src=twsrc%5Etfw">May 31, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>)}}
239
240 1 kanata
# Linuxのセキュリティ機構
241
242
## NX bit
243
244
プロセスの全てのメモリ領域において、読み・書き・実行が可能だと、セキュリティ上良くない。
245
セクション毎に、読み・書き・実行の権限を制御できるようにしたのが、NX。
246
247
Microsoft Windows的には **DEP** と呼ばれている。
248
249
## ASLR
250
251
通常、同じプログラムであれば、関数のアドレスや、変数の格納先アドレス等、何度実行しても変化することはない。
252
この「変化しない」という性質を利用して、任意の関数を呼ばれたりして悪意のある攻撃につながってしまう。
253
254
ASLRは、heap領域以降のアドレスをランダム化(アドレス空間配置のランダム化)することで、これらの攻撃を防ぐのが目的。
255
ASLRだと起動するたびにheap領域以降のアドレスが変化する。
256
257
ただし、ランダム化されるのheap領域以降と限定されるため、アドレスが固定化されている部分を利用した攻撃に対するリスクは残っている。
258
259
通常のheapの開始アドレスは、0x0804XXXXとかになるが、ASLRだと0xfXXXXXXXで始まるアドレスになる。
260
261
## SSP(GCC Stack-Smashing Protector)
262
スタックバッファオーバーフローを防ぐセキュリティ機構の一つ。
263
SSPを有効にすると、関数の呼び出し時にスタックにcanaryと呼ばれる値が置かれる。
264
関数から出る時(リターン前)に、canaryが変更されていないか検証(__stack_chk_fail関数の呼出)され、書き換えられていたら強制終了する。
265
266
### master canaryはどこにあるか
267
268
master canary というスタックに置かれた値との比較元は、どこにあるか。
269
270
* THREAD_SET_STACK_GUARD にて決められている。
271
 * 7アーキテクチャにて定義
272
 * canaryがTLS(thread local storage)に入る。TLSはヒープ領域に格納される。
273
 * 定義されていないならmaster canaryは.bssへ
274
 * ヒープも.bssセクションも、通常は書き込み権限があるので、書き換え可能。
275
 * canaryは、バイナリが再起動するまで変化しない。
276
277
### 参考
278
279
[@potetisensei](https://twitter.com/potetisensei?lang=ja)の[CODE BLUE](http://codeblue.jp/)の時の発表が神解説。
280
https://www.youtube.com/watch?v=UTC2iWxQ4qc&feature=youtu.be&a
281
http://www.slideshare.net/codeblue_jp/master-canary-forging-by-code-blue-2015
282
https://github.com/potetisensei/MasterCanaryForging-PoC
283
284
## RELRO
285
286
外部ライブラリ(共有オブジェクト *.so)を利用するとき、それらはアドレス空間の色々なところにマッピングされている。
287
これらで提供されている関数のアドレスを毎回計算で求めるのは大変なので、一度計算したら保存しておくテーブルがあると便利。
288
そのテーブルのことをGOT(Global Offset Table)と呼び、アドレス固定領域に存在している。
289
290
このGOTテーブルが、もし書き換えられると任意の関数を実行できてしまう。
291
それを防ぐ手段として、Partial RELRO と Full RELRO の二種類がある。
292
293
| 種類          | 遅延バインド | 説明                                                                 |
294
|---------------|--------------|----------------------------------------------------------------------|
295
| Partial RELRO | 有効         | .got.pltセクションが存在し、一部書き換え可能
296
| Full RELRO    | 無効(起動時間が遅くなる) | .got.pltセクションは無い。リードオンリーな .gotセクションのみがある。
297
298
**遅延バインド**について
299
300
普通、遅延バインドと言うと、Partial RELRO の時の動きを言うんだと思う。
301
302
| 種類          | 説明 |
303
|---------------|------|
304
| RELRO 無し    | オブジェクトがロードされた時(プログラムの起動時)に、dynamic linkerが全てのGOTのエントリに本当の関数のアドレス(libc.soのputsなど)を埋める。
305
| Partial RELRO | オブジェクトがロードされた時(プログラムの起動時)には、.got.pltセクションに特別な値を入れておき、本当の関数のアドレス調査を、その関数の初回呼び出し時まで遅延する
306
| Full RELRO    | 遅延BINDしない。プログラム実行開始時に.gotセクションを全部書き換える。全部書き換え終わったら、.gotセクションを書き込み禁止にする
307
308
## PIE
309
ASLRが有効な場合、スタック領域・ヒープ領域や共有ライブラリが置かれるアドレスは一定の範囲の中でランダムに決められる。
310
一方、実行ファイルそのものが置かれるアドレスは基本的には固定であるが、PIE (Position-Independent Executables) となるようにコンパイル・リンクすることでランダムなアドレスに置けるようにできる。
311
312
313
314
## ASCII-armor
315
316
共有ライブラリをメモリ上に配置するときにNULL(0x00) を含むアドレスへ配置するようにする。
317
strcpy 等を利用してのメモリ書き換えを防止するため。
318
319
# Vulnerabilities(脆弱性)
320
321
## Stack Buffer Overflow(スタックバッファオーバーフロー)
322
323
![wikipedia_StackBufferOverflow.png](wikipedia_StackBufferOverflow.png)
324
325
入力値チェックの無い変数にサイズオーバーで値を詰めると、スタックの底の方を書き換えられる。
326
スタックの底には、call時に関数復帰先のアドレスが設定される。
327
328
書き換える内容にシェルコードを含めておき、復帰先は、そこに飛ぶようにうまく上書きすれば、スタックの中だけでexploit処理が完結できる。ただし、NX bitで、この方法を無効にできる。
329
330
NTTデータ先端技術株式会社 - CTFで学ぶ脆弱性(スタックバッファオーバーフロー編・その1)
331
http://www.intellilink.co.jp/article/column/ctf01.html
332
333
## Heap Buffer Overflow(ヒープバッファオーバーフロー)
334
335
NEC 古賀さんによるありがたい解説
336
http://www.soi.wide.ad.jp/class/20040011/slides/19/45.html
337
https://www.nic.ad.jp/ja/materials/security-seminar/20041004/3-koga.pdf
338
339
Github - yannayl / GlibC Malloc for Exploiters
340
https://github.com/yannayl/glibc_malloc_for_exploiters
341
342
>かなり綺麗にまとまっている
343
344
345
### ヒープの仕組み
346
347
1. ヒープはフリーリストという構造になっている。
348
2. この1つの要素を共有する状態を作る。
349
3. 共有すると要素が抱える次の要素と前の要素を指すポインタを書き換えることができる。
350
4. 書き換えられれば、指し先をスタックにして、任意の値を書き込むことで、任意コードの実行まで出来る。
351
352
図を入れる。入れたい。
353
354
malloc(3)のメモリ管理構造
355
http://www.valinux.co.jp/technologylibrary/document/linux/malloc0001/
356
357
mallocの旅(glibc編)
358
http://www.slideshare.net/kosaki55tea/glibc-malloc
359
360
>神解説
361
362
363
### Use After Free
364
365
mallocで一度確保され解放された後に、尚そのアドレスに書き込むことが可能な場合に起きる。
366
既にそのアドレスは別の用途に転用されている場合、そのアドレスのデータを書き換え可能。
367
368
### Double Free
369
370
free()での二重解放。
371
解放されているアドレスを解放されていないものと思い込んで使い続けると、ヒープ内のデータが破損する可能性がある。
372
373
NEC 古賀さんによるありがたい解説
374
http://www.soi.wide.ad.jp/class/20040011/slides/19/61.html
375
376
### off-by-one error
377
378
NEC 古賀さんによるありがたい解説
379
http://www.soi.wide.ad.jp/class/20040011/slides/19/59.html
380
381
### House of XXXシリーズ
382
383
bataさんによる神解説
384
https://pastebin.com/raw/mrFNd19w
385
386
CTFするぞ - House of Corrosionの解説
387
https://ptr-yudai.hatenablog.com/entry/2019/10/19/002039
388
389
390
391
392
## Race Condition(リソース競合)
393
394
排他書が正しく実装されてなかったりした時、Use After FreeやDouble Free,もしくはスタックBOF/ヒープBOFに繋がる。
395
396
## Format String Bug (FSB)
397
398
### 参考
399
400
sekai013's blog - Format String Attack でメモリの中身を書き換える Mac OS X 10.10
401
http://sekai013.hatenablog.com/entry/2015/08/20/195649
402
403
NEC 古賀さんによるありがたい解説
404
http://www.soi.wide.ad.jp/class/20040011/slides/19/67.html
405
406
CTFするぞ - Format String Exploitを試してみる
407
https://ptr-yudai.hatenablog.com/entry/2018/10/06/234120
408
409
## Time-of-check-Time-of-use Race Condition (TOCTOUリソース競合)
410
411
ある処理AとBの間に、別の動作を無理やり割り込ませて、想定外の動作を引き起こす方法。
412
413
# Exploit Techniques - メモリ領域を上書きする
414
415
## .got overwrite
416
417
.gotセクションは外部関数アドレスのキャッシュであるため、ここを任意の関数のアドレスに書き換えることで、任意の関数が実行できる。
418
RELROにより、セクション内の書き込み権限がない場合は、成立しない。
419
420
ユーザの入力をそのまま受け付ける以下の関数があれば、.gotをsystem()に書き替えておくと,呼び出された時system(user_input)になる。
421
422
- strlen()
423
- strcmp()/memcmp()
424
- atoi()/strtol()
425
- free()
426
427
## Heap Buffer Overflow(ヒープバッファオーバーフロー)からの Unlink Attack と fastbins Unlink Attack
428
429
### Unlink Attack
430
431
ヒープバッファオーバーフローで,直下がfree済みチャンクの際,fd/bkメンバを上書き。
432
ただし、2004年以降のlibcにおけるfree()では、チェック機構が加わり、このUnlink Attackは起きない。
433
434
### fastbins Unlink Attack
435
436
fastbinsは、高速化のため実装された機構
437
fastbinsに入る小さなチャンクが直下にある状態で、ヒープバッファオーバーフローし、fdメンバを上書きできる
438
これによりfastbins UnlinkAttackができてしまう可能性がある。
439
440
### 参考
441
442
katagaitai CTF勉強会 #1 pwnables編 - DEFCON CTF 2014 pwn1 heap
443
http://www.slideshare.net/bata_24/katagaitai-ctf-1-57598200
444
445
> bataさん神
446
447
448
## ネットワークソケットを利用したシェル起動
449
450
(整理中)
451
ここに置くのが適切かわからん。。。
452
453
454
## _IO_jump_t overwrite
455
456
(整理中)
457
ここに置くのが適切かわからん。。。
458
459
460
461
462
463
# Exploit Techniques - 任意のアドレス(またはアドレスにある値)を漏洩させる
464
465
## DT_DEBUG,dl_runtime_resolve
466
467
dl_runtime_resolveやDT_DEBUGを利用することで、libc内のアドレスを動的に求めることができる。
468
469
dl_runtime_resolve
470
>PLTで使われる,外部関数のアドレスを動的解決する関数
471
472
473
474
475
476
477
# Exploit Techniques - セキュリティ機構を回避する
478
479
## byte-by-byte bruteforceによるSSP回避(x86)
480
481
1バイトずつブルートフォースすれば、256*4回の試行でStack Canaryを特定できる
482
(x64なら256*8回)
483
Stack Canaryは,TLS(Thread local storage)に格納されている
484
x86ではgs+0x14,x64ではfs+0x28にポインタが存在する
485
この値を書き換えられるなら,Stack Canaryは無効化できる
486
487
## Improper Null Terminationを利用したSSP回避
488
489
(作成中)
490
491
492
493
## Partial overwrite
494
495
ASLRおよびPIEが有効な場合、.textセクションもランダム化される。
496
しかしリトルエンディアン環境においては、リターンアドレスなどの下位バイトのみを書き換えることで付近のコードにジャンプさせることが可能となる。
497
498
リトルエンディアンの場合0x12345678はスタック上で 0x78563412と格納されている。
499
よってBOFなどにより例えば0x78の下位2バイトのみを書き換える事で、近いアドレスにジャンプさせる事ができ る。
500
飛ばせる先が限られている(他の手法と組み合わせ て使う場合が多い)、リトルエンディアンでしか使えない。
501
502
## Heap spray
503
504
(作成中)
505
506
507
508
# Exploit Techniques - 命令を実行する
509
510
(作成中)
511
512
はて、どうやって整理したものか
513
514
## ret2系
515
516
(作成中)
517
518
| 種類        | 説明 |
519
|-------------|------|
520
| ret2libc    | NX bitによる実行制御を回避するため、libcにあるsystem関数にretするようスタックを書き換える。いい感じにスタックポインタも操作して、書き換えた"/bin/sh"を指すようにする。ASLRやPIEでランダム化されると、厳しい。
521
| ret2esp     | スタック中にjmp espや、call espに復帰するようなアセンブラコードを仕込む。当然ながらjmp espやcall espがコード中に無ければ成立しない。
522
| ret2plt     | PLTを引数/戻り先と一緒にスタックへ仕込めば,通常の関数呼出と区別できない。
523
| ret2pop     | pop,pop,pop,pop,pop,pop,ret 等のガジェットを見つけて、スタックを減らして、次に実行したい関数と引数を積む技。
524
| ret2strcpy  | 
525
| ret2resolve |
526
527
## ROP系
528
529
(作成中)
530
531
{{rawhtml(<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">意地でもROPを理解させるという強い意志の動画です <a href="https://t.co/eGzrwGCoyc">pic.twitter.com/eGzrwGCoyc</a></p>&mdash; kurenaif🪄🗝@VTuber (@fwarashi) <a href="https://twitter.com/fwarashi/status/1657790229590478848?ref_src=twsrc%5Etfw">May 14 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>)}}
532
533
↓けっこう参考になる
534
535
ROP 輕鬆談
536
http://www.slideshare.net/hackstuff/rop-40525248
537
538
ASLRは、通常実行体まではランダム化されないため、実行体の中の小さな命令(ROP gadgetsと言う)を集めてシェルコードを作る。
539
スタックにある関数復帰先のアドレスを制御し続けることで成し得る。  
540
541
例えば、main関数から関数funcを読んだ先に脆弱性があったとする。
542
スタックが書き換えられるが、リターンの先をmainからgadgetに書き換える。
543
gadgetもretするが、その復帰先は、次のgadgetを指すようにする。
544
これを繰り返す。
545
546
PIEまでやられて、実行体もランダム化されると、この方法によるシェル奪取が難しくなる。
547
548
549
550
### ROP系小技
551
552
* __libc_csu_init gadgets
553
554
スタックからレジスタへ値を入れられる汎用ガジェットがある
555
556
* alarm(x)
557
558
x86/x64で、EAX/RAXレジスタにROPで任意の値を入れたいケース
559
ROPガジェットを探索しても、pop eax/raxが見つからない場合がよくある
560
alarm()を使うと、代替可能
561
ret2pltでalarm(x)-> alarm(0)と2回行えば、EAX/RAXレジスタにxが入る
562
563
* ROP stager
564
565
攻撃に使える領域のサイズが制限されている場合、readなどの関数を用いて再度メモリに書き込む方法をstagerと呼ぶ。
566
567
* DROP(Dynamic ROP)
568
569
漏洩させたlibcのアドレスを元に,***libc内のガジェット***を利用してROPを構築
570
.textのガジェットが少ない場合の対処法
571
相手環境のlibcがわかっていることが前提
572
573
* One-gadget-RCE
574
575
DragonSectorの資料
576
http://j00ru.vexillium.org/?p=2485
577
578
>x64でsystem("/bin/sh")を呼ぶ場合、条件付き(x64かつxinetd型でのみ有効)だが8バイトの書き込みで代替する方法がある
579
580
### SROP(Sigreturn-oriented Programming)
581
582
vdsoには、シグナル割り込みから復帰する際に、ユーザーランドのスタック上に作成したsignal frameに保存している値を全てのレジスタへ戻すsigreturnという命令が存在する。つまり、popadが廃止されたx64においても、sigreturnによってスタック上の値を複数のレジスタにセットすることができる。これによって、任意のシステムコールを呼び出すことが可能となるほか、関数の呼び出しがレジスタ渡しの場合においてもROPが容易になる。なお、vsyscallはASLRが有効であっても固定アドレスである。
583
ulimit -s unlimitedを用いてvdsoのマッピングアドレスを固定できる場合はCTFでも活用できそうだ。
584
585
### JOP(Jump-oriented programming) と COP(Call-oriented programming)
586
587
通常、retの次にはそのサブルーチンを呼び出したcallの次の命令が存在する。そこで、コールスタックを辿ることでROPによってretが使われていないか検出するROPguardが考案された。ROPguardはMicrosoftの脆弱性対策ツールであるEMET 3.5の根幹を成す理論だった。
588
そこで、retの代わりにjmpを用いるJump-oriented programmingが考案された。また、retやjmpの代わりにcallを用いるCall-oriented programmingも可能である。例えば以下のコードスニペットにおいて、callはjmpと実質的に等価である。
589
590
~~~
591
pop esi;
592
ret;
593
push eax;
594
call esi;
595
596
; call先
597
pop esi ;retアドレスを除去
598
;eaxを用いる処理
599
~~~
600
601
COPでは、pushのような表現力の高い命令を用いることができる。
602
603
# Exploit Techniques - シェルコードを置くメモリ領域を確保する
604
605
## Stack pivot
606
607
スタックのサイズ上、リターンアドレスの下にROP chainを構築できないような場合、xchg esp,eaxなどのgadgetを用いてスタックのアドレスを移動させる方法をstack pivotと呼ぶ。
608
609
スタックアドレスの設定先は、.bssセクションが使える(write権限がある)。.bssの先頭付近ではなく,中間ぐらいに設定するとよい(スタックの頭打ちを防ぐため)。
610
611
## Stager
612
613
BOFにより、書き換えられる量が少ない場合
614
615
* 短いアセンブリコードをBOFで送り込む
616
* これを最初に実行させ,shellcodeを追加読込をさせる
617
* 追加読み込みした部分へ制御を移す
618
619
と言う流れで対応することをstagerと言う。
620
621
# Command gadgets
622
623
katagaitai ctf study session - setup
624
http://pastebin.com/dWUV06ug
625
626
## 各種PLT/GOTを調査
627
628
```
629
$ objdump -d -M intel /bin/cat|grep "@plt>:" -A1
630
00000000004015b0 <__uflow@plt>:
631
  4015b0:       ff 25 62 aa 20 00       jmp    QWORD PTR [rip+0x20aa62]        # 60c018 <__sprintf_chk@plt+0x20a608>
632
--
633
00000000004015c0 <getenv@plt>:
634
  4015c0:       ff 25 5a aa 20 00       jmp    QWORD PTR [rip+0x20aa5a]        # 60c020 <__sprintf_chk@plt+0x20a610>
635
--
636
00000000004015d0 <free@plt>:
637
  4015d0:       ff 25 52 aa 20 00       jmp    QWORD PTR [rip+0x20aa52]        # 60c028 <__sprintf_chk@plt+0x20a618>
638
--
639
640
.
641
.
642
.
643
644
645
0000000000401a00 <iconv_open@plt>:
646
  401a00:       ff 25 3a a8 20 00       jmp    QWORD PTR [rip+0x20a83a]        # 60c240 <__sprintf_chk@plt+0x20a830>
647
--
648
0000000000401a10 <__sprintf_chk@plt>:
649
  401a10:       ff 25 32 a8 20 00       jmp    QWORD PTR [rip+0x20a832]        # 60c248 <__sprintf_chk@plt+0x20a838>
650
```
651
652
## 関数アドレスの調査
653
654
まず利用しているlibcのパスを調べる
655
656
```
657
$ ldd /bin/cat
658
        linux-vdso.so.1 =>  (0x00007fff3c3e2000)
659
        libc.so.6 => /lib64/libc.so.6 (0x00007fc824120000)
660
        /lib64/ld-linux-x86-64.so.2 (0x00007fc8244ed000)
661
```
662
663
libc内のsystemのオフセット調査
664
665
```
666
$ objdump -d /lib64/libc.so.6|grep "system>:"
667
0000000000041f00 <do_system>:
668
00000000000423d0 <__libc_system>:
669
```
670
671
## 固定文字列のアドレス調査
672
673
```
674
$ strings -tx /lib64/libc.so.6 |grep '/bin/sh'
675
 17b249 /bin/sh
676
677
```
678
679
## アドレス固定のRW領域(.data)調査
680
681
IDA Proでもできます。
682
683
```
684
$ readelf -S ropasaurusrex |fgrep .data
685
```
686
687
## gdb-pedaインストール手順
688
689
CentOS7の場合(既存のgdbを潰さない方法)
690
691
```
692
# yum install python-devel texinfo ※他に足りないパッケージがあったら、同じく入れる(たぶん大丈夫)
693
# su - user
694
$ mkdir /home/user/gdb-peda
695
$ cd /home/user/gdb-peda
696
$ wget http://ftp.gnu.org/gnu/gdb/gdb-7.9.tar.gz
697
$ tar pxzf gdb-7.9.tar.gz
698
$ cd gdb-7.9
699
$ ./configure --with-python=python && make
700
$ yum install git
701
$ git clone https://github.com/longld/peda.git /home/user/gdb-peda/peda
702
$ echo "source /home/user/gdb-peda/peda/peda.py" >> gdbinit
703
```
704
pedaの動作チェック
705
起動したら’start’と打ち,カラフルな画面が出てきたらインストール成功
706
707
```
708
$ /home/user/gdb-peda/gdb-7.9/gdb/gdb -q /bin/ls --data-directory=/home/user/gdb-peda/gdb-7.9/gdb/data-directory -x /home/user/gdb-peda/gdbinit
709
```
710
711
なので、こういう起動シェル作っとけば、既存のgdbと共存できる
712
713
gdb-peda.sh
714
715
```
716
#!/bin/bash
717
/home/user/gdb-peda/gdb-7.9/gdb/gdb -q ${1}  --data-directory=/home/user/gdb-peda/gdb-7.9/gdb/data-directory -x /home/user/gdb-peda/gdbinit ${2} ${3} ${4} ${5} ${6} ${7} ${8} ${9}
718
```
719
720
----
721
ちな、Ubuntu(x64)の場合(参考)
722
723
```
724
$ apt-get install libncurses5-dev g++ python-dev texinfo
725
$ cd /tmp
726
$ wget http://ftp.gnu.org/gnu/gdb/gdb-7.9.tar.gz
727
$ tar pxzf gdb-7.9.tar.gz
728
$ cd gdb-7.9
729
$ ./configure --with-python=python2 && make && make install
730
$ apt-get install git
731
$ git clone https://github.com/longld/peda.git ~/peda
732
$ echo "source ~/peda/peda.py" >> ~/.gdbinit
733
```
734
735
pedaの動作チェック
736
起動したら’start’と打ち,カラフルな画面が出てきたらインストール成功
737
738
```
739
$ gdb -q /bin/ls
740
```
741
742
### pop×Nガジェットを調査(rp++の方が精度がいい)
743
744
```
745
$ gdb ./binary –q
746
gdb-peda $ start
747
gdb-peda $ ropgadget
748
```
749
750
## gdb-dashboardインストール手順
751
752
[ここ](https://github.com/cyrus-and/gdb-dashboard)から、.gdbinitをダウンロード
753
gdbinit_gdb-dashbordと名前を変える。
754
755
起動用シェルを作る。
756
757
```
758
$ vi gdb-dashboard.sh
759
+ gdb ${1} ${2} ${3} ${4} ${5} ${6} ${7} ${8} ${9} -x /home/user/gdbinit_gdb-dashboard
760
761
$ chmod ugo+x gdb-dashboard.sh
762
```
763
764
## rp++インストール手順
765
766
```
767
$ wget https://github.com/downloads/0vercl0k/rp/rp-lin-x86
768
$ wget https://github.com/downloads/0vercl0k/rp/rp-lin-x64
769
```
770
771
### ROPガジェットの抽出
772
773
```
774
$ rp-lin-x86 --file=binary --unique --rop=5
775
```
776
777
## Metasploit Framework インストール手順
778
779
```
780
$ sudo apt-get -y install \
781
  build-essential zlib1g zlib1g-dev \
782
  libxml2 libxml2-dev libxslt-dev locate \
783
  libreadline6-dev libcurl4-openssl-dev git-core \
784
  libssl-dev libyaml-dev openssl autoconf libtool \
785
  ncurses-dev bison curl wget postgresql \
786
  postgresql-contrib libpq-dev \
787
  libapr1 libaprutil1 libsvn1 \
788
  libpcap-dev \
789
  libsqlite3-dev
790
791
$ sudo apt-get install ruby1.9.3       # rvmを使う代わりに直接インストール
792
$ cd /opt
793
$ sudo git clone https://github.com/rapid7/metasploit-framework.git
794
$ cd metasploit-framework
795
$ sudo gem install bundler --no-ri --no-rdoc
796
$ bundle install
797
```
798
799
### EIPまでのオフセットを計算 (pattern_create.rb pattern_offset.rb)
800
801
ユニークな文字列生成
802
803
```
804
$ /opt/metasploit-framework/tools/pattern_create.rb 200
805
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag
806
```
807
808
コマンド引数に渡したりして、落ちる所を確認
809
810
```
811
$ gdb -q a.out
812
Reading symbols from /home/user/tmp/a.out...(no debugging symbols found)...done.
813
(gdb) r
814
Starting program: /home/user/tmp/a.out
815
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag
816
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag
817
818
Program received signal SIGSEGV, Segmentation fault.
819
0x64413764 in ?? ()
820
(gdb) quit
821
```
822
823
EIPが0x64413764で落ちている。0x64413764が、生成した文字列のどの部分か調べる。
824
825
```
826
$ /opt/metasploit-framework/tools/pattern_offset.rb 0x64413764
827
[*] Exact match at offset 112
828
```
829
830
112バイト目からの4バイトがEIPになっている。
831
832
## socatサーバ化ワンライナー
833
834
```
835
$ socat TCP-LISTEN:4444,reuseaddr,fork exec:./binary&
836
```
837
838
## objdumpのdiffをいい感じに取る
839
840
```
841
$ diff -u1 -F '>:$' -I '[0-9a-f]\{6,\}' <(objdump -d test1 | cut -f2-) <(objdump -d test2 | cut -f2-)
842
```
843
844
詳細は、[ももいろテクノロジー objdumpのdiffをいい感じに取る方法のメモ](http://inaz2.hatenablog.com/entry/2016/04/30/073738)参照
845
846
847
## LD_PRELOAD環境変数によるライブラリ関数フック
848
849
詳細は、[ももいろテクノロジー LD_PRELOAD injectionでOpenSSLによる暗号化処理を覗いてみる](http://inaz2.hatenablog.com/entry/2016/03/15/192125)参照
850
851
ここも
852
853
しゃろの日記 - rev問のソルバを書くときとかに使えるかもしれない小テク
854
http://charo-it.hatenablog.jp/entry/2016/12/15/084701
855
856
857
858
859
860
# 動的デバック環境
861
862
## fork-server型とxinetd型について
863
864
fork-server型
865
866
 - バイナリ内にbind→listen→acceptがある
867
 - gdbではset follow-fork-mode childを設定する
868
 - 親プロセスが残り続けてしまうので、都度親プロセスのkillする工夫が必要
869
870
xinetd型
871
872
 - バイナリ内にbind→listen→acceptがない
873
 - xinetdにのせるのは、面倒なので、socatで代用する
874
875
## xinetd型のための、socatとgdb-serverの利用
876
877
socatとgdb-serverを利用して、3つのTerminalをうまく使う
878
879
### 待ち受け側 - TerminalA
880
881
```
882
$ vimain.sh
883
gdbserver localhost:1234 ./a.out
884
$ chmod +x main.sh
885
$ socat TCP-LISTEN:1025,reuseaddr,fork EXEC:"./main.sh"
886
```
887
888
### 攻撃側 - TerminalB
889
890
```
891
$ perl -e'print "A"x140 ."BBBB"'|nc localhost 1025
892
```
893
894
### デバッグ側 - TerminalC
895
896
```
897
vi cmd
898
file ./a.out
899
target remote localhost:1234
900
c
901
$ gdb ./a.out -q -x cmd
902
```
903
904
905
906
907
908
909
910
911
# x86/x64以外のアーキ
912
913
Learning ARM Exploit Development
914
https://owlinux1000.github.io/ARM_Exploit/
915
916
# Study
917
918
NEC 古賀さんによるありがたい解説
919
http://www.soi.wide.ad.jp/class/20040011/slides/19/
920
https://www.nic.ad.jp/ja/materials/security-seminar/20041004/3-koga.pdf
921
922
Shellphishによるheap exploitのテクニック解説
923
https://github.com/shellphish/how2heap
924
925
katagaitai CTF勉強会資料
926
http://www.slideshare.net/bata_24/presentations
927
928
杨坤:掘金CTF ——CTF中的内存漏洞利用技巧, Geekon 2015
929
http://netsec.ccert.edu.cn/blog/2015/10/29/1093 http://netsec.ccert.edu.cn/wp-content/uploads/2015/10/2015-1029-yangkun-Gold-Mining-CTF.pdf
930
931
>スライドの攻撃手法がまとまっていてよさ
932
933
h_nosonの日記 - pwn challenges list baby, easyについて
934
http://h-noson.hatenablog.jp/entry/2017/12/22/000000
935
936
>pwn challenges listのbabyとeasyの一部を解いて、どんな問題が多かったか、何に躓いたかなど
937
938
939
ハリネズミ本 ~pwn編~
940
https://hackmd.io/GwBgHGBmCcDGYFowBMAsj0GZZNgU0RBFnzxD1UmQCYg=?view#
941
942
Linux Reverse Engineering CTFs for Beginners
943
https://osandamalith.com/2019/02/11/linux-reverse-engineering-ctfs-for-beginners/amp/?__twitter_impression=true
944
945
swisskyrepo/PayloadsAllTheThings
946
https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/README.md
947
948
guyinatuxedo/nightmare
949
https://github.com/guyinatuxedo/nightmare/tree/master/modules
950
951
>過去のCTF のリバース、Pwn 問題がジャンル別にまとめられています
952
953
趣味と実益のスタック破壊
954
http://web.archive.org/web/20010910201811/linux.ascii24.com/linux/linuxcom/2000/06/13/465216-001.html
955
956
C++のpwn/revで使うSTLコンテナの構造とバグパターン一覧
957
https://ptr-yudai.hatenablog.com/entry/2021/11/30/235732
958
959
マルウェア解析は IDAPython にシュッとやらせよう
960
https://blog.nflabs.jp/entry/idapython
961
962
Understanding the Heap - a beautiful mess
963
ヒープを理解する - 美しい混乱
964
https://jackfromeast.site/2023-01/understand-the-heap-a-beautiful-mess.html
965
966
Dirty Pagetableを理解する(m0leCon Finals CTF Writeup)
967
https://ptr-yudai.hatenablog.com/entry/2023/12/07/221333
968
969
Exploit Reversing
970
https://exploitreversing.com
971
972
The toddler’s introduction to Heap exploitation (Part 1)
973
https://infosecwriteups.com/the-toddlers-introduction-to-heap-exploitation-part-1-515b3621e0e8
974
975
ゼロからのハイパーバイザ自作入門
976
https://zenn.dev/hidenori3/books/55ce98070299db
977
978 10 kanata
Reversing for dummies - x86 assembly and C code (Beginner/ADHD friendly)
979
初心者向けリバースプログラミング - x86 アセンブリと C コード (初心者/ADHD 向け)
980
https://0x44.cc/reversing/2021/07/21/reversing-x86-and-c-code-for-beginners.html
981 1 kanata
982 17 kanata
A Quick Dive Into The Linux Kernel Page Allocator - Linuxカーネルのページアロケータの簡単な解説
983
https://syst3mfailure.io/linux-page-allocator/
984
985
986
987
988
989 1 kanata
990
# Memo
991
992
## Pwn環境の構築/ツール導入
993
994
【memo】 pwn環境構築の覚書
995
https://smallkirby.hatenablog.com/entry/2020/01/07/234124
996
997
998
999
## Kernel Exploit
1000
1001
るくすの日記 - カーネルエクスプロイト入門 - Linuxカーネル解析の基礎
1002
http://rkx1209.hatenablog.com/entry/2017/07/13/184358
1003
1004
CTFするぞ - Kernel Exploitで使える構造体集
1005
https://ptr-yudai.hatenablog.com/entry/2020/03/16/165628
1006
1007
sec4b-2023 の driver4b で Linux のカーネルエクスプロイトに入門してみる
1008
https://kashiwaba-yuki.com/ctf-sec4b-kernel-exploit
1009
1010
1011
1012
## Exploit系テクニック
1013
1014
ももいろテクノロジー - Exploit系複合テクニックのメモ
1015
http://inaz2.hatenablog.com/entry/2016/12/17/180655
1016
1017
Modern Binary Exploitation
1018
http://security.cs.rpi.edu/courses/binexp-spring2015/
1019
1020
hama7230 SlideShare
1021
https://www.slideshare.net/hama7230/presentations
1022
1023
OUR BLOG - TOP 10プロセスインジェクションテクニック
1024
https://www.endgame.com/blog/technical-blog/ten-process-injection-techniques-technical-survey-common-and-trending-process
1025
1026
yyy - ROP Emporium Writeup(32bit) 
1027
http://ywkw1717.hatenablog.com/entry/2017/12/07/235405
1028
1029
Harekaze 外部wiki - Pwn・Exploitテクニック一覧
1030
https://harekaze.com/wiki/#!resources/pwn/technics.md
1031
1032
>すばら
1033
1034
各種OSのUserlandにおけるPwn入門
1035
http://nanuyokakinu.hatenablog.jp/entry/2018/12/09/223440
1036
1037
ROP Emporium
1038
https://ropemporium.com/
1039
1040
>x86とx64 binaryがあってスタックの呼び方の比較とかがしやすい
1041
1042
GTFOBins: 攻撃者が悪用できるLinuxコマンドの一覧
1043
https://gtfobins.github.io
1044
1045
>各コマンドから別のコマンドが使えるもの一覧、シェルが直接呼べなくてもコマンド経由で呼べたりする
1046
1047
libcにデバッグシンボルを付ける方法と自動化
1048
https://satoooon1024.hatenablog.com/entry/2022/06/12/libc%E3%81%AB%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E3%82%B7%E3%83%B3%E3%83%9C%E3%83%AB%E3%82%92%E4%BB%98%E3%81%91%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%A8%E8%87%AA%E5%8B%95%E5%8C%96
1049
1050
1051
1052
1053
1054
1055
## ASLRのアドレス特定テクニック
1056
1057
この世にあるlibcをdatabase化すればいいじゃない!!
1058
1059
libcdb.com
1060
http://libcdb.com/
1061
1062
niklasb/libc-database
1063
https://github.com/niklasb/libc-database
1064
1065
## Exploit DataBase
1066
1067
EXPLOIT DATABASE
1068
https://www.exploit-db.com/
1069
1070
## Unpack
1071
1072
サイバーセキュリティ研究所 - アンパック手順 覚え書き
1073
http://www.wivern.com/malware20161101.html
1074
1075
Unpacking Executables - The ESP Trick
1076
https://goggleheadedhacker.com/blog/post/6
1077
1078
> パックされたバイナリを手動でアンパックする「ESP Trick」テクニックについて
1079
1080
株式会社Ninjastars 技術研究部 - リバースエンジニアリング対策 -難読化編パート2-
1081
https://www.ninjastars-net.com/entry/2019/05/20/190000
1082
1083
1084
## Malware解析 - Rev
1085
1086
Malware Unicorn - Reverse Engineering Malware 101 Material
1087
https://securedorg.github.io/RE101/
1088
1089
## Windows関係
1090
1091
Shellcode - Exploit Development Community - Windowsシェルコード作成について 
1092
http://expdev-kiuhnm.rhcloud.com/2015/05/22/shellcode/
1093
1094
Github - MalwareCantFly/Vba2Graph (VBAの解析・可視化)
1095
https://github.com/MalwareCantFly/Vba2Graph
1096
1097
CTFするぞ - 2019年のpwn問を全部解くチャレンジ【前半戦】
1098
https://ptr-yudai.hatenablog.com/entry/2019/07/01/143652
1099
1100
CTFするぞ - 2019年のpwn問を全部解くチャレンジ【後半戦】
1101
https://ptr-yudai.hatenablog.com/entry/2019/12/23/122844
1102
1103
Magical WinDbg 2 - CTF で学ぶユーザモード & カーネルデバッギング - (WEB 版)
1104
https://kashiwaba-yuki.com/magical-windbg-vol2-00