环境问题
首先,我有两套环境。一个windows一个arch,都是物理机。
其中,windows上拥有kali-wsl和win_penetration_toolkit-vmware,平常的pwn题是采用
-
wsl-kali执行python脚本/gdb调试,patchelf+glibc-all-in-one,windows主机ida分析
缺点是,windows上没有docker。做不了内核题。优点是,windows上具有渗透测试的虚拟机,可以说渗透基本上必须用win(blackarch开发不是很全)
而linux环境上也有原生ida支持,也能做,缺点在于没有杂七杂八的工具比如anytxt,localsend这种,也缺misc工具,以及渗透的工具。
linux准备好ubuntu的三个docker,都安装gdb?
pwn题配置
参考自文章1
准备
手动patch,使用ida keypatch即可。打包命令:
1 | tar -cvf archive.tar file1 file2 directory |
常见漏洞的patch方法
格式化字符串漏洞
-
printf=>puts,直接改call的地址即可。风险是puts会在结尾添加换行,不一定能过检查。
-
强行调整参数。rdi放"%s",rsi放原参数。程序里有%s在的话会好一点,如果没有%s的话,我们可能要找3字节塞进去如下内容:
1 | 0x25 0x73 0x00== %s\0 |
但是指令也可能不够长?
UAF
“UAF就直接把free nop掉” ——某位大跌学长
check过程中没办法检查是否有free,所以直接nop掉free似乎是个不错的方案。反正也爆不了,内存就在那扔着你也不能怎么样
整数溢出
整数溢出比较简单,修改相应判断指令的跳转逻辑就行(?)将有符号跳转改为无符号?
缓冲区溢出
改小相关的输入长度,分x86和x64,写死的数值参数x86需要patch push指令,但是注意,在操作数大于0x100的时候push内容可能会变化,涉及到栈平衡的问题需要注意。
x64就直接patch寄存器赋值即可。
scanf的话尝试将"%s"改成"%ns"来限制输入长度,如果长度是动态的尝试了下改成read(0,buf,len)一般汇编也是够的
VM
核心是防止在vm指令执行过程中越界/非预期的读写,具体问题具体分析,肯定会有执行指令过程中的check漏洞
逻辑漏洞
nop漏洞分支(nop掉跳转指令)敏感函数的参数权限(如mmap等)
通防
给程序加沙箱直接无脑关闭execve调用,但是通防可能被检测,自行斟酌
https://github.com/TTY-flag/evilPatcher
测试下来,二进制文件大小没有变化,线下试试吧。
非预期?
程序如果exit退出,打io的话尝试nop掉exit或者改成_exit?
检查漏洞
敏感功能函数,strlen获取长度限制能不能塞满溢出,scanf%s的输入
docker命令
1 | docker run -it -d -v host_path:container_path -p host_port:container_port --cap-add=SYS_PTRACE IMAGE_ID # auto update 自动执行update.sh脚本 |