⾼级栈溢出技术—ROP实战(pivot)
⽬录
预备知识
关于ROP
ROP的全称为Return-orientedprogramming(返回导向编程),这是⼀种⾼级的内存攻击技术可以⽤来绕过现代操作系统的各种通⽤防
御(⽐如内存不可执⾏和代码签名等)。
ROP是⼀种攻击技术,其中攻击者使⽤堆栈的控制来在现有程序代码中的⼦程序中的返回指令之前,⽴即间接地执⾏精⼼挑选的指令或机器
指令组。
本系列rop实战题⽬的背景
来⾃ROPEmporium,旨在通过解决⼀系列挑战来⼀步步进阶学习ROP利⽤技术。
pivot涉及知识点
1)radare2使⽤(相关专栏:)。
2)汇编程序(阅读、分析,要求熟悉相关指令、寄存器等)。
3)gdb使⽤。
4)ROPGadget使⽤。
5)pwntools使⽤(相关实验:)。
6)操作系统保护机制。
7)函数调⽤、传参机制。
8)PLT表、GOT表。
9)ROP中针对栈空间限制的处理技巧。
实验⽬的
通过该实验学习ROP概念及其思路,了解⾼级栈溢出时需要注意的事项,并掌握解决⽅法,同时通过练习给出的关卡来增强实践能⼒。
实验环境
实验步骤⼀
第七关pivot。
⾸先看⼀下基本信息:
rabin2-Ipivot
r2-AAA./pivot
先看看pwnme:
pdf@
在上图中可以看到我们的exp应该需要两个chain。
同时告诉我们从调⽤了ret2win()。
再来看看ulessFunction:
pdf@sFunction
可以看到调⽤了foothold_function,但是其⾃⾝没有被调⽤。
接下来看看:
查看其中的函数:
前⾯在分析pwnme时其中特地提到了ret2win,所以我们在这⾥反汇编看看:
pdf@2win
可以看到ret2win会打印flag。
实验步骤⼆
从题⽬的说明中:
我们知道栈空间被限制了,但是我们具体可以放多少空间呢?
使⽤gdb进⾏分析:
gdb./pivot
输⼊r运⾏:
然后第⼀次输⼊a,第⼆次输⼊⼀串A:
看⼀下rsp的情况:
可以看到⼀共是3个qword,即3个⼋字节。
我们的任务就是通过这些空间,以某种⽅式把我们的空间pivot到⼀个更⼤的空间。
我们注意到,在运⾏的时候,程序会打印出⼀个缓冲区的地址,这就是第⼀个fgets使⽤的。我们可以改变指向那个缓冲区的rsp寄存器的
值,这个值将是我们ROPchain的第⼆段。
我们先ropgadget看看可⽤的gadget:
ROPgadget--binarypivot
我们可以使⽤poprax,ret,然后将缓冲区的地址放在第⼆个位置上,最后xchgrax,rsp,交换值:
这是第⼀段ropchain。
实验步骤三
接下来我们要解决的是由于ALSR机制,我们该如何得到ret2win函数的地址。
解决办法是计算相对于foothold_function的偏移,然后在第⼆段中加上计算出来的值就可以了。
回到r2分析分析时得到的地址:
计算偏移为0x14e。
然后我们要知道foothold_function在plt,got中的偏移:
r2-AAA./pivot
地址是0x400850。
地址是0x602048。
这样写第⼆段ropchain的准备⼯作也完成了。
关键部分在于:
⾸先调⽤foothold_function来填充.;
popfoothold_function的got到rax寄存器;
向rax中添加偏移得到ret2win的;
最后进⾏调⽤即可。
完整代码在:
运⾏后如图所⽰:
本文发布于:2023-03-08 20:38:21,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/1678279102187127.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:rop.doc
本文 PDF 下载地址:rop.pdf
留言与评论(共有 0 条评论) |