Rgzz's Record

知道的越多,不知道的越多。

0%

为什么heap spary要用0x0C0C0C0C这个奇怪的数字?

在讨论这个问题之前,先向小白介绍一下什么是 Heap Spary?

Heap Spary 又叫堆喷射,是在 shellcode 的前面加上大量的slide code(滑板指令),组成一个注入代码段。然后向系统申请大量内存,并且反复用注入代码段来填充。这样就使得内存被大量的注入代码占据。然后通过结合其他漏洞控制程序流,使得程序执行到堆上,最终将导致shellcode的执行。

[TOC]

函数指针的定义

程序中的每个函数都位于内存中的某个位置,所以存在**指向那个位置的指针(函数指针)**是完全可能的。

函数指针定义形式:

1
2
3
returnType (*pointerName)(param list);
//例子
int (*pf)();

returnType 为函数返回值类型,pointerNmae 为指针名称,param list 为函数参数列表。参数列表中可以同时给出参数的类型和名称,也可以只给出参数的类型,省略参数的名称,这一点和函数原型非常类似。

[toc]

系统环境

**系统环境:**Linux kali 5.14.0-kali4-amd64 (2021-11-05)

搭建步骤

第一步

在主目录下创建一个 tools 目录,用来存放下载下来的文件,命令如下:

1
mkdir tools

image-20220724105421464

第二步

安装pwntools

  1. 进入tools文件夹里面
1
cd tools

image-20220724105554318

题目地址: 666

将附件下载到本地后,直接拖进 IDA 进行分析,点击进入 main 函数。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
 ; =============== S U B R O U T I N E =======================================
 ; Attributes: bp-based frame

 ; int __cdecl main(int argc, const char **argv, const char **envp)
                 public main
 main            proc near               ; DATA XREF: _start+1D↑o

 s               = byte ptr -1E0h		   ; s[480]
 var_F0          = byte ptr -0F0h		   ; var_fo[240],存放scanf输入参数

 ; __unwind {
            push    rbp
            mov     rbp, rsp
            sub     rsp, 1E0h
            lea     rax, [rbp+s]
            mov     edx, 1Eh        ; n
            mov     esi, 0          ; c
            mov     rdi, rax        ; s
            call    _memset			; memset(s, 0, 0x1EuLL);
            
            lea     rdi, format     ; "Please Input Key: "
            mov     eax, 0
            call    _printf
            
            lea     rax, [rbp+var_F0]
            mov     rsi, rax
            lea     rdi, aS         ; "%s"
            mov     eax, 0
            call    ___isoc99_scanf
            
            lea     rdx, [rbp+s]
            lea     rax, [rbp+var_F0]
            mov     rsi, rdx
            mov     rdi, rax
            call    encode			;关键函数,这里对输入字符进行了加密
            
            lea     rax, [rbp+var_F0]
			mov     rdi, rax        ; s
			call    _strlen
			mov     rdx, rax
			mov     eax, cs:key
			cdqe
			cmp     rdx, rax
			jnz     short loc_138D
			lea     rax, [rbp+s]
			lea     rsi, enflag     ; "izwhroz\"\"w\"v.K\".Ni"
			mov     rdi, rax        ; s1
			call    _strcmp
			test    eax, eax
			jnz     short loc_1381
			lea     rdi, aYouAreRight ; "You are Right"
			call    _puts
			jmp     short loc_138D
 ; ---------------------------------------------------------------------------

 loc_1381:                               ; CODE XREF: main+A0↑j
			lea     rdi, aFlagThis1sF4ck ; "flag{This_1s_f4cker_flag}"
            call    _puts

 loc_138D:                               ; CODE XREF: main+86↑j
                                         ; main+AE↑j
            mov     eax, 0
            leave
            retn
; } // starts at 12D1
 main       endp

按下 F5 ,反汇编,这下就清楚程序运行逻辑了,程序对输入字符进行字符编码,然后与 enflag(“izwhroz""w"v.K".Ni”)进行比较。。。

[toc]

MS08-067 简介

MS08-067 漏洞是由于 netapi32.dll 的导出函数 NetpwPathCanonicalize 在处理字符串时出现了错误,从而导致栈溢出,并且影响的操作系统范围很广,包括引入了 GS 安全机制的 Windows XP SP2、 Vista 以及 Windows 7。

[toc]

RPC 漏洞

RPC 漏洞简介

RPC 即 Remote Procedure Call,它是一种计算机进程间的通信方式。简单地说,RPC 就是让您在自己地程序中调用一个函数(可能需要很大地计算量),而这个函数在另外一个或多个远程机器上执行,执行完后将结果传回您的机器进行后续操作。

[toc]

堆保护机制的原理

堆中的安全校验操作

  • **PEB random:**在 Windows XP SP2 之后不再使用固定的 PEB 基址 0x7ffdf000,而是使用具有一定随机性的 PEB 基址。Matt C onover 指出这种变动只是在 0x7FFDF000~0x7FFD4000 之间移动。覆盖 PEB 中函数指针的利用方式请参见 “堆溢出利用(下)”中的实验和“攻击 PEB 中的函数指针” 的相关介绍。
  • Safe Unlink: 微软改写了操作双向链表的代码,在卸载 free list 中的堆块时更加小心。

对照“堆溢出利用(上)——DWORD SHOOT”中关于双向链表拆卸问题的描述,在 SP2 之前的链表拆卸操作类似于如下代码:

[toc]

SEHOP 的原理

SEHOP(Structured Exception Handling Overwrite Protection),它在 Windows Server 2008 默认启用,而在 Windows Vista 和 Windows 7 中 SEHOP 默认是关闭的。

启用 SEHOP 有以下两种方式:

( 1)下载 http://go.microsoft.com/?linkid=9646972 的补丁,此补丁适用于 Windows 7 和 Windows Vista SP1。 ( 2)在注册表中 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\kernel 下面找到 DisableExceptionChainValidation 项, 将该值设置为 0,即可启用 SEHOP。

[toc]

内存随机化保护机制的原理

前面的所有漏洞利用都有一个共同特征:都需要确定一个明确的跳转地址。而 ASLR(Address Space Layout Randomization)技术就是通过使用随机的基址加载程序,从而干扰 shellcode 定位的一种保护机制。