栈对齐
栈对齐
前言
太菜了QWQ,困惑了很久(主要是在脚本中不知道该怎么进行gdb调试),今天下午研究了一下,造成最后攻击失败的结果应该是movaps
指令搞的鬼,经过测试Ubuntu20里有这个问题,Ubuntu16没有。movaps
指令要求其目的操作数必须是16的倍数,也就是说其操作数的数值的16进制数的最后一位必须为0,这里看一个例子更容易理解§( ̄▽ ̄)§
环境、源码编译
Ubuntu20.04
gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
ldd (Ubuntu GLIBC 2.31-0ubuntu9.9) 2.31
python3编写exp.py 使用pwntools库
tmux
zsh(oh-my-zsh)
pwndbg、pwngdb
……
附:在终端下使用的是环境是tmux,直接在terminal输入tmux即可进入,想要使鼠标上下滑动查看和选择区间可以在主目录下的.tmux.conf
(没有就新建一个)文件里添加set -g mouse on
源码
test.c
1 |
|
最后一行就是编译命令
1 | gcc -g -z execstack -fno-stack-protector -no-pie -z lazy test.c -o test |
附:想要偷懒也可以,我把编译好的文件和相关的文件存入了这里:https://github.com/lucky-xiaobai/research_pwn/tree/main/stack/Stack%20alignment
利用思路
检查保护(其实编译的时候就已经限制了相关的保护)
64位,没有开启保护
扔进ida分析
main
sub_0111111101
heiheihei(后门函数)
得到后门函数的地址0x0000000000401196
分析结束,其实是一个很简单的ret2text
类型的程序,由于栈上可执行也可以直接填充shellcode
,这里就选择前者的方法,修改到后门函数执行就可以了
再找一个ret
用来为后面的栈对齐做准备
这里就选最后一个了:ret=0x000000000040101a
exp
先写一个未栈对齐的exp
exp
1 | from pwn import* |
可以先把调试的语句注释掉看一下最终是否能成功
可以看到结果是失败的,把注释掉的调试语句取消掉注释。
运行调试查看一下
左面显示处于暂停状态,选择左面,然后按一下回车,得到如下
剩下只需要分析右面的gdb中的信息即可
可以使用ni
单步分析
也可以使用finish
跳出当前的系统函数
几次后,得到如下的状态,可以看到sub_01111101
函数执行结束后到后门函数那边去了,接下来为了避免跳出关键函数,使用ni
单步调试
如下,接下来再填入一次ni
就是报错的地方了,其实这里已经可以看到栈已经不对齐了(rsp
末尾是8)
调试到movaps
指令时候如下所示,显然,rsp=0x7fffffffdba8
,所以造成了溢出的失败
再写一个栈对齐的exp
exp
1 | from pwn import* |
这里就直接去调试了,调试的过程和上面一模一样
调试结果如下
再填入ni
就可以程序没有跳转到报错的movaps
那边,而是正常的结束了
总结
检测栈对齐其实就是movaps
指令造成的,可以填充一个或多个ret
指令来使栈上的数据对齐。