diff --git a/SUMMARY.md b/SUMMARY.md index dd00885..0ac88a2 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -128,13 +128,16 @@ GitHub 地址:https://github.com/firmianay/CTF-All-In-One * web * [6.3.1 web HCTF2017 babycrack](doc/6.3.1_web_hctf2017_babycrack.md) * [七、实战篇](doc/7_exploit.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.3 [CVE-2016-4971] wget 1.17.1 Arbitrary File Upload](doc/7.1.3_wget_2016-4971.md) - * [7.1.4 [CVE-2017-13089] wget 1.19.1 Buffer Overflow](doc/7.1.4_wget_2017-13089.md) - * [7.1.5 [CVE–2018-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.7 [CVE-2018-6323] GNU binutils 2.26.1 Integer Overflow](doc/7.1.7_binutils_2018-6323.md) + * CVE + * [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.3 [CVE-2016-4971] wget 1.17.1 Arbitrary File Upload](doc/7.1.3_wget_2016-4971.md) + * [7.1.4 [CVE-2017-13089] wget 1.19.1 Buffer Overflow](doc/7.1.4_wget_2017-13089.md) + * [7.1.5 [CVE–2018-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.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) * [8.1 更多 Linux 工具](doc/8.1_Linuxtools.md) * [8.2 更多 Windows 工具](doc/8.2_wintools.md) diff --git a/doc/7.1.7_binutils_2018-6323.md b/doc/7.1.7_binutils_2018-6323.md index 96f23cd..b4fccfa 100644 --- a/doc/7.1.7_binutils_2018-6323.md +++ b/doc/7.1.7_binutils_2018-6323.md @@ -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 支持的对象文件(比如COFF,a.out等)。对每一个文件格式来说,BFD 都分两个部分:前端和后端。前端给用户提供接口,它管理内存和规范数据结构,也决定了哪个后端被使用和什么时候后端的例程被调用。为了使用 BFD,需要包括 `bfd.h` 并且连接的时候需要和静态库 `libbfd.a` 或者动态库 `libbfd.so` 一起连接。 + +看一下这个引起崩溃的二进制文件,它作为一个可重定位文件,本来不应该有 program headers,但这里的 Number of program headers 这一项被修改为一个很大的值,已经超过了程序在内存中的范围: ``` $ file test 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 [----------------------------------registers-----------------------------------] @@ -306,7 +308,7 @@ EFLAGS: 0x206 (carry PARITY adjust zero sign trap INTERRUPT direction overflow) Legend: code, data, rodata, value 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 [----------------------------------registers-----------------------------------] @@ -342,7 +344,7 @@ EFLAGS: 0xa07 (CARRY PARITY adjust zero sign trap INTERRUPT direction OVERFLOW) Legend: code, data, rodata, value 0x080aeba3 780 elf_tdata (abfd)->phdr = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt); ``` -于是,在随后的 `bfd_alloc()` 调用时,第二个参数即分配的大小为 0,导致了最后拒绝服务攻击的发生: +于是,在随后的 `bfd_alloc()` 调用时,第二个参数即大小为 0,分配不成功: ```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); ``` +在后续的过程中,从 `bfd_close_all_done()` 到 `objalloc_free()`,用于清理释放内存,其中就对 `bfd_alloc()` 分配的内存区域进行了 `free()` 操作,而这又是一个不存在的地址,于是抛出了异常。 + #### 补丁 该漏洞在 binutils-2.30 中被修复,补丁将 `i_ehdrp->e_shnum` 转换成 unsigned long 类型的 `bfd_size_type`,从而避免整型溢出。BFD 开发文件包含在软件包 `binutils-dev` 中: ```c // /usr/include/bfd.h typedef unsigned long bfd_size_type; ``` -由于存在回绕,一个无符号整数表达式永远无法求出小于零的值,因此不会产生溢出。 +由于存在回绕,一个无符号整数表达式永远无法求出小于零的值,也就不会产生溢出。 所谓回绕,可以看下面这个例子: ```c @@ -407,6 +411,7 @@ ui--; printf("ui = %u\n", ui); // 在 32 位上,ui = 4 294 967 295 ``` +补丁如下: ```diff $ git show 38e64b0ecc7f4ee64a02514b8d532782ac057fa2 bfd/elfcode.h commit 38e64b0ecc7f4ee64a02514b8d532782ac057fa2 diff --git a/doc/7_exploit.md b/doc/7_exploit.md index 460be6c..664780c 100644 --- a/doc/7_exploit.md +++ b/doc/7_exploit.md @@ -1,9 +1,12 @@ # 第七篇 实战篇 -- [7.1.1 [CVE-2017-11543] tcpdump 4.9.0 Buffer Overflow](7.1.1_tcpdump_2017-11543.md) -- [7.1.2 [CVE-2015-0235] glibc 2.17 Buffer Overflow](7.1.2_glibc_2015-0235.md) -- [7.1.3 [CVE-2016-4971] wget 1.17.1 Arbitrary File Upload](7.1.3_wget_2016-4971.md) -- [7.1.4 [CVE-2017-13089] wget 1.19.1 Buffer Overflow](7.1.4_wget_2017-13089.md) -- [7.1.5 [CVE–2018-1000001] glibc Buffer Underflow](7.1.5_glibc_2018-1000001.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) +- CVE + - [7.1.1 [CVE-2017-11543] tcpdump 4.9.0 Buffer Overflow](7.1.1_tcpdump_2017-11543.md) + - [7.1.2 [CVE-2015-0235] glibc 2.17 Buffer Overflow](7.1.2_glibc_2015-0235.md) + - [7.1.3 [CVE-2016-4971] wget 1.17.1 Arbitrary File Upload](7.1.3_wget_2016-4971.md) + - [7.1.4 [CVE-2017-13089] wget 1.19.1 Buffer Overflow](7.1.4_wget_2017-13089.md) + - [7.1.5 [CVE–2018-1000001] glibc Buffer Underflow](7.1.5_glibc_2018-1000001.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