2014 hack.lu CTF OREO
house of spirit就不写了没啥写的,所有的检查fastbin dup里都有提。这题写的也没有那么折磨( •̀ ω •́ )y
逆向
main
注意一点,notice里存的是notice_context的地址,上面的是malloc的chunk的数量cnt和free的chunk的数量cnt_del,这一块之后将用于伪造fake chunk
main_和read_num
真正的主函数,没啥好说的
读入一个数
这道题很奇怪的一点就是exp中gdb.attach后收不到”Action: “,原因未知。总之交互很奇怪
add
可以通过溢出改变chunk链。会递增cnt
show
输出所有chunk
delete
删除所有chunk,递增cnt_del,无uaf
message
留言在notice所指向的地址
stats
输出cnt、cnt_del和notice,没啥用
思路
先add一个chunk,溢出到最后四字节改指针指向puts的got表然后show泄露libc基址
可以在cnt和notice这块伪造fake chunk,把cnt当作size。由于chunk申请的大小是0x40,所以我们要再申请0x40个chunk(之前已经有一个了),并且最后一个chunk的最后四字节要指向0x804a28
message留言fake chunk的后半部分。chunk的最后四字节置0,nextchunk的size和presize布置为合法值
delete,fake chunk进入fastbin且为第一个chunk
add回fake chunk,将notice覆盖为elf.got[‘strlen’]-0x8
再message,写
1
b'/bin/sh\x00'+p32(system_addr)这时内存就是这样的
1 | |
- 之后replace_enter_0中会执行strlen(notice),这时候实际执行的就是system(‘/bin/sh’)

Exp
1 | |
2014 hack.lu CTF OREO
http://akaieurus.github.io/2023/02/02/hack-lu-CTF-2014-OREO/