搭建环境
由于是第一次接触PWN,所以先在网上找了些环境搭建的博客看看,然后发现这篇很好很全,推荐:https://www.jianshu.com/p/1476f38e3aa3
这次题目主要用到的工具有:
pwntools:用python开发的一个ctf框架和漏洞利用开发库
ROPgadget:好像只用了一次,用来搜索”/bin/sh”字符串所在的位置
IDA:嗯,必备的,不说了
checksec:查看可执行文件属性的工具
checksec包含的保护机制
1)CANNARY(栈保护)
栈溢出保护是一种缓冲区溢出攻击缓解手段,当函数存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址来让shellcode能够得到执行。当启用栈保护后,函数开始执行的时候会先往栈里插入cookie信息,当函数真正返回的时候会验证cookie信息是否合法,如果不合法就停止程序运行。攻击者在覆盖返回地址的时候往往也会将cookie信息给覆盖掉,导致栈保护检查失败而阻止shellcode的执行。在Linux中我们将cookie信息称为canary。
2)FORTIFY
3)NX(DEP)
NX即No-eXecute(不可执行)的意思,NX(DEP)的基本原理是将数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。
4)PIE(ASLR)
一般情况下NX(Windows平台上称其为DEP)和地址空间分布随机化(ASLR)会同时工作。
内存地址随机化机制(address space layout randomization),有以下三种情况
0 - 表示关闭进程地址空间随机化。
1 - 表示将mmap的基址,stack和vdso页面随机化。
2 - 表示在1的基础上增加栈(heap)的随机化。
可以防范基于Ret2libc方式的针对DEP的攻击。ASLR和DEP配合使用,能有效阻止攻击者在堆栈上运行恶意代码。
5)RELRO
设置符号重定向表格为只读或在程序启动时就解析并绑定所有动态符号,从而减少对GOT(Global Offset Table)攻击。RELRO为” Partial RELRO”,说明我们对GOT表具有写权限。
checksec这一部分来自这
正文
写了pwn新手区的八道题,由于时间仓促,来不及写writeup,于是就总结一下遇到的几种情况.
格式化字符串漏洞
讲这个之前,必须先了解栈和栈帧.
这里的漏洞是指printf的格式化漏洞.以前学的C语言讲,printf(“%d %d”,a,b)格式化输出要和变量对应,输出几个就要有几个对应的变量,但是实际上,没有对应的变量时,printf也能执行,它会自动从栈中读取.
而格式化输出的参数里,有一个”%n
“,它的作用是将它前面的字符个数写入当前栈顶指针所指向的地址对应的存储空间,还一个就是”%?$n”,就是将%前面的字符个数写入[ESP+?]所指向的内存空间.
那么,如果我们知道我们要修改的变量相对于栈顶指针的位置,那我们就可以对其进行修改了.
寻找偏移量的话,一般是利用输入函数的漏洞,输入包含”%p-%p-%p-%p-%p”的字符,来实现地址的打印,从而发现变量的相对位置.
写shellcode
详见第七题string
shellcode就是在程序漏洞处执行的特定代码.
写shellcode的时候要注意先设置目标机的参数
1 | context(os='linux',arch='amd64') |
然后获取shellcode的话就是获取执行system(“/bin/sh”)汇编代码所对应的机器码,通过python语句
1 | asm(shellcraft.()) |
获得
gets的漏洞
gets()是一个极其不安全的函数,因为它没有限定读入的字符个数.第八题就利用到了这一点,直接将生成伪随机数的种子给覆盖,然后程序生成的随机数变成一串已知的数字序列,从而触发”cat flag”的条件,获得flag