Rgzz's Record

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

0%

Open: PEB,TEB结构关系图.png

由 BeingDebugged 引发的蝴蝶效应

BeingDebugged

Win 32 API IsDebuggerPresent 函数用来判断自己是否处于调试状态。

1
2
3
4
5
//debug.c
BOOL APIENTRY IsDebuggerPresent(VOID)
{
    return NtCurrentPeb()->BeingDebugged;
}

这个函数读取了当前进程 PEB(Process Environment Block,进程环境块) 中的 BeingDebugged 标志。

题目地址 pwnstack

0x1

下载文件到本地后,首先,file 看看文件类型,顺便看看保护机制。

1
2
3
4
5
6
7
8
9
sakura@Kylin:~/下载/pwnstack$ file pwn2
pwn2: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=62aa40d64871e142a32827b4e403772e72f67fba, not stripped
sakura@Kylin:~/下载/pwnstack$ checksec pwn2
[*] '/home/sakura/下载/pwnstack/pwn2'
    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      No PIE (0x400000)

可以看到,这是一个 64 位程序,并且只开启了 NX 保护机制。

题目地址 ret2syscall

0x1

下载文件到本地后,首先,file 看看文件类型,顺便看看文件类型。

1
2
3
4
5
6
7
8
9
sakura@Kylin:~/下载/ret2syscall$ file rop
rop: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.24, BuildID[sha1]=2bff0285c2706a147e7b150493950de98f182b78, with debug_info, not stripped
sakura@Kylin:~/下载/ret2syscall$ checksec rop
[*] '/home/sakura/下载/ret2syscall/rop'
    Arch:     i386-32-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      No PIE (0x8048000)

可以看到,这是一个 32 位程序,并且只开启了 NX 保护机制。

题目地址 ret2libc

ret2libc

0x1

将文件下载到本地后,file 查看文件类型,顺便 checksec 看看保护机制。

1
2
3
4
5
6
7
8
9
sakura@Kylin:~/下载/ret2libc/ret2libc1$ file ret2libc1
ret2libc1: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=fb89c86b266de4ff294489da59959a62f7aa1e61, with debug_info, not stripped
sakura@Kylin:~/下载/ret2libc/ret2libc1$ checksec ret2libc1
[*] '/home/sakura/下载/ret2libc/ret2libc1/ret2libc1'
    Arch:     i386-32-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      No PIE (0x8048000)

源程序为 32 位,开启了 NX 保护。

题目地址: ret2win

0x1

拿到题目后,首先检查一下文件类型,看看保护机制。

1
2
3
4
5
6
7
8
9
sakura@Kylin:~/下载/ret2win$ file ret2win
ret2win: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=19abc0b3bb228157af55b8e16af7316d54ab0597, not stripped
sakura@Kylin:~/下载/ret2win$ checksec ret2win
[*] '/home/sakura/下载/ret2win/ret2win'
    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      No PIE (0x400000)

它是一个 64 位的程序,可以看到只开启了 NX。要想绕过它,就要运用 ROP 技术了。

基本 ROP

ROP 简介

最开始,只需将函数返回地址覆盖为 jmp esp 指令的地址,然后在后面添加 shellcode 就可以执行。后来引入了 NX 机制,数据所在内存页被标记为不可执行,此时再执行 shellcode 就会抛出异常。既然注入的代码不行,那就复用程序中已有的代码。

1 数组越界

先区分一下数组越界漏洞溢出漏洞

  • 数组越界访问包含读写类型
  • 溢出属于数据写入
  • 部分溢出漏洞本质确实就是数组越界漏洞。

数组越界就像是倒水的时候倒错了杯子,溢出就像是水从杯子里溢出来。

0x1

题目地址

拿到题目,首先看看文件类型,以及保护机制。 image-20220903235214002

我们发现它缺少执行权限,加上权限后执行,是简单的输入输出,不过这里似乎给到我们了一个地址。