mirror of
https://github.com/nganhkhoa/CTF-All-In-One.git
synced 2024-12-24 19:21:15 +07:00
fix
This commit is contained in:
parent
48f465ccdc
commit
12befe6ebd
@ -128,6 +128,7 @@ 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)
|
||||
* 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)
|
||||
@ -135,6 +136,8 @@ GitHub 地址:https://github.com/firmianay/CTF-All-In-One
|
||||
* [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)
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user