RoarCTF wp
realloc_magic一共三个功能 realloc。realloc 0可以达到free+清零的效果。 free。存在UAF,可以realloc已经free的内存。 backdoor。功能是清零,只能用一次。 overlap tcache 的方法是free块8次,就可以把这一块放到unsorted bin里,把块分为A|B,A和B得不一样大,realloc(A.size)得到A,realloc(0)把A放到tcache里,realloc(B.size)得到B,realloc(0)把B放到tcache里,realloc(A+B的size)改B的size和fd,realloc(B.size),realloc(0),再realloc(B.size)就可以得到fd所在的内存。 通过以上overlap的方法改..
Read moreheap overlap方法小结
本文不考虑和top合并, 并且大小非fastbin。实际做题的时候得要考虑top。 free时overlappoison_null_byteP(P是size被null的块)|Q 需要构造的点: 1. chunksize(P) == prev_size (next_chunk(P)) //因为offbyone后的size一定<=原始size,所以prev_size (next_chunk(P)) 可以自己伪造 2.free(P)后分割P为块A和B A|B,此时Q的pre_inuse也为0了 3.free A,free Q,A和Q会 consolidate, B就被overlap了 注意 free 的时候 - 检查前一个chunk空闲吗(检查本块的prev_inuse) - 检查后一个是不是top chu..
Read morexman wp
weapon_store三个功能:view、buy、checkout view,有点想吐槽,你一个卖武器的,价目表居然跟实际价格不一样。。下面的buy功能可以看到实际价格计算方法是100 * (v3 + 1) - 29,也就是说武器1卖171,武器2卖271。371。471。。。。 buy,先计算买的武器单价*数量是不是超过了手里的money,没超过就放到购物车里,但可以通过整数溢出绕过这个限制;另外可以看到malloc的时候还和0x1ff与了一下,可能有堆溢出。 checkout,当手里的money少于买下所有武器要花的钱时,就给你一次堆溢出的机会,这时可以把其他武器的name改换为flag输出。 输入选项的地方看起来可以泄露点什么出来 但这个地方存放的是两个栈里的值,一个text段的值,也得不到..
Read moreByteCtf note_five 两种解法
阅读大佬的wp后复现了一下本题的多种解法 题目分析 本题是一道菜单题,只有new、edit和delete功能,没有show功能。不存在UAF。 edit所用的输入函数存在Off-By-One漏洞 chunk 的大小限制在 0x8f ~ 0x400 解题思路1(exp见文末)利用Off-By-One漏洞构造Overlapping,构造块的bk 为global_max_fast -0x10, unsorted bin attack 修改global_max_fast;利用 stdout-0x51处的 0xff 作为 chunk 的 size,fast bin attack 到_IO_2_1_stdout_附近分配chunk,修改_IO_write_base中的值,使它指向想要泄露的地址(stdout+0..
Read moreIDA打patch学习小结
keypatch基本使用keypatch是用来辅助打patch的一个插件。IDA本身有简单的patch功能,可以写十六进制和汇编语句。keypatch提供的功能主要是可以即时显示汇编语句的十六进制,你可以知道你的汇编占多少字节,打完patch后在它把原汇编备注在旁边,它还可以帮你计算跳转偏移。 Edit -> Keypatch -> Patcher 选中一行指令patch 可以输入汇编代码 nop啥的。 Edit -> Keypatch -> Fill Range 选中一定范围的指令一起patch 可以输入汇编代码,也可以输入16进制 “90” “0x90” “90,91” “AAh”等。 Edit -> Patch program -> Apply patches t..
Read morepwnable wp
fdfd是文件描述符,fd=0为标准输入 ssize_t read(int fd,void *buf,size_t nbyte) read函数从fd中读取内容到buf。 col构造命令行参数 from pwn import * pwn_ssh = ssh(host='pwnable.kr',user='col',password='guest',port=2222) code = '\xE8\x05\xD9\x1D'+'\x01'*16 cn = pwn_ssh.process(argv=['col',code],executable='./col') print(cn.recv()) b..
Read more