This commit is contained in:
firmianay 2018-03-08 21:05:51 +08:00
parent 48f465ccdc
commit 12befe6ebd
3 changed files with 30 additions and 19 deletions

View File

@ -128,6 +128,7 @@ GitHub 地址https://github.com/firmianay/CTF-All-In-One
* web * web
* [6.3.1 web HCTF2017 babycrack](doc/6.3.1_web_hctf2017_babycrack.md) * [6.3.1 web HCTF2017 babycrack](doc/6.3.1_web_hctf2017_babycrack.md)
* [七、实战篇](doc/7_exploit.md) * [七、实战篇](doc/7_exploit.md)
* CVE
* [7.1.1 [CVE-2017-11543] tcpdump 4.9.0 Buffer Overflow](doc/7.1.1_tcpdump_2017-11543.md) * [7.1.1 [CVE-2017-11543] tcpdump 4.9.0 Buffer Overflow](doc/7.1.1_tcpdump_2017-11543.md)
* [7.1.2 [CVE-2015-0235] glibc 2.17 Buffer Overflow](doc/7.1.2_glibc_2015-0235.md) * [7.1.2 [CVE-2015-0235] glibc 2.17 Buffer Overflow](doc/7.1.2_glibc_2015-0235.md)
* [7.1.3 [CVE-2016-4971] wget 1.17.1 Arbitrary File Upload](doc/7.1.3_wget_2016-4971.md) * [7.1.3 [CVE-2016-4971] wget 1.17.1 Arbitrary File Upload](doc/7.1.3_wget_2016-4971.md)
@ -135,6 +136,8 @@ GitHub 地址https://github.com/firmianay/CTF-All-In-One
* [7.1.5 [CVE2018-1000001] glibc Buffer Underflow](doc/7.1.5_glibc_2018-1000001.md) * [7.1.5 [CVE2018-1000001] glibc Buffer Underflow](doc/7.1.5_glibc_2018-1000001.md)
* [7.1.6 [CVE-2017-9430] DNSTracer 1.9 Buffer Overflow](doc/7.1.6_dnstracer_2017-9430.md) * [7.1.6 [CVE-2017-9430] DNSTracer 1.9 Buffer Overflow](doc/7.1.6_dnstracer_2017-9430.md)
* [7.1.7 [CVE-2018-6323] GNU binutils 2.26.1 Integer Overflow](doc/7.1.7_binutils_2018-6323.md) * [7.1.7 [CVE-2018-6323] GNU binutils 2.26.1 Integer Overflow](doc/7.1.7_binutils_2018-6323.md)
* Malware
* 7.2.x
* [八、附录](doc/8_appendix.md) * [八、附录](doc/8_appendix.md)
* [8.1 更多 Linux 工具](doc/8.1_Linuxtools.md) * [8.1 更多 Linux 工具](doc/8.1_Linuxtools.md)
* [8.2 更多 Windows 工具](doc/8.2_wintools.md) * [8.2 更多 Windows 工具](doc/8.2_wintools.md)

View File

@ -106,7 +106,9 @@ objdump: test: File format not recognized
## 漏洞分析 ## 漏洞分析
首先看一下这个引起崩溃的二进制文件,它作为一个可重定位文件,本来不应该有 program headers但这里的 Number of program headers 这一项被修改为一个很大的值,已经超过了程序在内存中的范围: 首先要知道什么是 BFD。BFD 是 Binary File Descriptor 的简称,使用它可以在你不了解程序文件格式的情况下,读写 ELF header, program header table, section header table 还有各个 section 等。当然也可以是其他的 BFD 支持的对象文件(比如COFFa.out等。对每一个文件格式来说BFD 都分两个部分:前端和后端。前端给用户提供接口,它管理内存和规范数据结构,也决定了哪个后端被使用和什么时候后端的例程被调用。为了使用 BFD需要包括 `bfd.h` 并且连接的时候需要和静态库 `libbfd.a` 或者动态库 `libbfd.so` 一起连接。
看一下这个引起崩溃的二进制文件,它作为一个可重定位文件,本来不应该有 program headers但这里的 Number of program headers 这一项被修改为一个很大的值,已经超过了程序在内存中的范围:
``` ```
$ file test $ file test
test: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped test: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
@ -270,7 +272,7 @@ display_any_bfd (bfd *file, int level)
} }
``` ```
溢出点乘法运算前eax 为我们在二进制文件中伪造的数值 `0x20000000` 因为伪造的数值 `0xffff` 大于 0进入读取 program headers 的代码。然后在溢出点乘法运算前eax 为伪造的数值 `0x20000000`
``` ```
gdb-peda$ ni gdb-peda$ ni
[----------------------------------registers-----------------------------------] [----------------------------------registers-----------------------------------]
@ -306,7 +308,7 @@ EFLAGS: 0x206 (carry PARITY adjust zero sign trap INTERRUPT direction overflow)
Legend: code, data, rodata, value Legend: code, data, rodata, value
780 elf_tdata (abfd)->phdr = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt); 780 elf_tdata (abfd)->phdr = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
``` ```
做乘法运算,`0x20000000 * 0x38 = 0x700000000`,产生溢出。截断后高位的 `0x7` 被丢弃, eax 为 `0x00000000` 做乘法运算,`0x20000000 * 0x38 = 0x700000000`,产生溢出。截断后高位的 `0x7` 被丢弃, eax 为 `0x00000000`,且 OVERFLOW 的标志位被设置
``` ```
gdb-peda$ ni gdb-peda$ ni
[----------------------------------registers-----------------------------------] [----------------------------------registers-----------------------------------]
@ -342,7 +344,7 @@ EFLAGS: 0xa07 (CARRY PARITY adjust zero sign trap INTERRUPT direction OVERFLOW)
Legend: code, data, rodata, value Legend: code, data, rodata, value
0x080aeba3 780 elf_tdata (abfd)->phdr = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt); 0x080aeba3 780 elf_tdata (abfd)->phdr = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
``` ```
于是,在随后的 `bfd_alloc()` 调用时,第二个参数即分配的大小为 0导致了最后拒绝服务攻击的发生 于是,在随后的 `bfd_alloc()` 调用时,第二个参数即大小为 0分配不成功
```c ```c
// bfd/opncls.c // bfd/opncls.c
@ -388,13 +390,15 @@ Legend: code, data, rodata, value
0x080aebab 780 elf_tdata (abfd)->phdr = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt); 0x080aebab 780 elf_tdata (abfd)->phdr = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
``` ```
在后续的过程中,从 `bfd_close_all_done()``objalloc_free()`,用于清理释放内存,其中就对 `bfd_alloc()` 分配的内存区域进行了 `free()` 操作,而这又是一个不存在的地址,于是抛出了异常。
#### 补丁 #### 补丁
该漏洞在 binutils-2.30 中被修复,补丁将 `i_ehdrp->e_shnum` 转换成 unsigned long 类型的 `bfd_size_type`从而避免整型溢出。BFD 开发文件包含在软件包 `binutils-dev` 中: 该漏洞在 binutils-2.30 中被修复,补丁将 `i_ehdrp->e_shnum` 转换成 unsigned long 类型的 `bfd_size_type`从而避免整型溢出。BFD 开发文件包含在软件包 `binutils-dev` 中:
```c ```c
// /usr/include/bfd.h // /usr/include/bfd.h
typedef unsigned long bfd_size_type; typedef unsigned long bfd_size_type;
``` ```
由于存在回绕,一个无符号整数表达式永远无法求出小于零的值,因此不会产生溢出。 由于存在回绕,一个无符号整数表达式永远无法求出小于零的值,也就不会产生溢出。
所谓回绕,可以看下面这个例子: 所谓回绕,可以看下面这个例子:
```c ```c
@ -407,6 +411,7 @@ ui--;
printf("ui = %u\n", ui); // 在 32 位上ui = 4 294 967 295 printf("ui = %u\n", ui); // 在 32 位上ui = 4 294 967 295
``` ```
补丁如下:
```diff ```diff
$ git show 38e64b0ecc7f4ee64a02514b8d532782ac057fa2 bfd/elfcode.h $ git show 38e64b0ecc7f4ee64a02514b8d532782ac057fa2 bfd/elfcode.h
commit 38e64b0ecc7f4ee64a02514b8d532782ac057fa2 commit 38e64b0ecc7f4ee64a02514b8d532782ac057fa2

View File

@ -1,9 +1,12 @@
# 第七篇 实战篇 # 第七篇 实战篇
- [7.1.1 [CVE-2017-11543] tcpdump 4.9.0 Buffer Overflow](7.1.1_tcpdump_2017-11543.md) - CVE
- [7.1.2 [CVE-2015-0235] glibc 2.17 Buffer Overflow](7.1.2_glibc_2015-0235.md) - [7.1.1 [CVE-2017-11543] tcpdump 4.9.0 Buffer Overflow](7.1.1_tcpdump_2017-11543.md)
- [7.1.3 [CVE-2016-4971] wget 1.17.1 Arbitrary File Upload](7.1.3_wget_2016-4971.md) - [7.1.2 [CVE-2015-0235] glibc 2.17 Buffer Overflow](7.1.2_glibc_2015-0235.md)
- [7.1.4 [CVE-2017-13089] wget 1.19.1 Buffer Overflow](7.1.4_wget_2017-13089.md) - [7.1.3 [CVE-2016-4971] wget 1.17.1 Arbitrary File Upload](7.1.3_wget_2016-4971.md)
- [7.1.5 [CVE2018-1000001] glibc Buffer Underflow](7.1.5_glibc_2018-1000001.md) - [7.1.4 [CVE-2017-13089] wget 1.19.1 Buffer Overflow](7.1.4_wget_2017-13089.md)
- [7.1.6 [CVE-2017-9430] DNSTracer 1.9 Buffer Overflow](7.1.6_dnstracer_2017-9430.md) - [7.1.5 [CVE2018-1000001] glibc Buffer Underflow](7.1.5_glibc_2018-1000001.md)
- [7.1.7 [CVE-2018-6323] GNU binutils 2.26.1 Integer Overflow](7.1.7_binutils_2018-6323.md) - [7.1.6 [CVE-2017-9430] DNSTracer 1.9 Buffer Overflow](7.1.6_dnstracer_2017-9430.md)
- [7.1.7 [CVE-2018-6323] GNU binutils 2.26.1 Integer Overflow](7.1.7_binutils_2018-6323.md)
- Malware
- 7.2.x