ROP-learn
学点技术 没坏处
什么是ROP
ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防御(比如内存不可执行和代码签名等)。通过上一篇文章走进栈溢出,我们可以发现栈溢出的控制点是ret处,那么ROP的核心思想就是利用以ret结尾的指令序列把栈中的应该返回EIP的地址更改成我们需要的值,从而控制程序的执行流程。
Why ROP
探究原因之前,我们先看一下什么是NX(DEP) NX即No-execute(不可执行)的意思,NX(DEP)的基本原理是将数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。 随着 NX 保护的开启,以往直接向栈或者堆上直接注入代码的方式难以继续发挥效果。所以就有了各种绕过办法,rop就是一种
ret2text
1 | ┌──(kali㉿kali)-[~/Desktop/hackme] |
在 gets()
处下断点
可以看到该字符串是通过相对于 esp 的索引,所以我们需要进行调试,将断点下在 call 处,查看 esp,ebp,如下
分析
查看一下 registers
ESP为0xffffd430
其中存放的内容为0xffffd44c
即输入的内容s的地址为ESP+0x1c
= 0xffffd44c
而EBP为0xffffd4b8
,则s到EBP的偏移为|0xffffd4b8- 0xffffd44c|
=6c
,所以s相对与返回地址的偏移为0x6c+4=0x70
直接 n
进入 main+107 输入一大串 1
可以发现EAX地址处确实保存的是s(数据换成1),且|EAX-ESP|==1c,即说明s是相对于ESP偏移的;但|EAX-EBP|==6c,和IDA给出的64h有差别,由此可知IDA给出的相对于ESP的偏移是正确的、但相对于EBP的偏移是有误差的,这就是之前说的IDA分析给出的偏移量并不那么可信。
使用GDB pattern字符串溢出计算偏移量
然后就是计算一下偏移量
得出s与函数返回地址的偏移为112即0x70。
1 | ##!/usr/bin/env python |
ret2shellcode
checksec 一下
1 | ┌──(kali㉿kali)-[~/Desktop/hackme] |
啥都没开?扔IDA里看一下
1 | ┌──(kali㉿kali)-[~/Desktop/hackme] |
下断点调试一下
卡了好久
1 | gef➤ vmmap |
不知道为什么 。。。就是和wiki上的结果不一样、、、
不知道是不是什么libc的问题 应该也不对?
但是确实能打的通。。。不懂
reference
https://firmianay.gitbooks.io/ctf-all-in-one/content/doc/2.3.1_gdb.html