house of emma
house of emma前言看完了kiwi,现在来看看emma,这两个手法的思路大差不差。但是emma有一道湖湘杯的例题,学习起来会方便很多 原理源码核心同样是kiwi当中的那个断言,但是修改的思路转变了。在kiwi中是修改虚表中某个函数指针,在emma中则是修改vtable的地址。这个地址是–_IO_cookie_jumps 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283/* Special file type for fopencookie function. */struct _IO_cookie_file{ struct _IO_FILE_plus __fp; void *__cookie; cookie_io_functions_t...
tcache_stashing_attack
tcache_stashing_attack前言 虽说已经准备考公了,但是自己还是喜欢打pwn , 感觉还是不能放弃。那就继续前进 原理1234567891011121314151617while ( tcache->counts[tc_idx] < mp_.tcache_count && (tc_victim = last (bin) ) != bin) //验证取出的Chunk是否为Bin本身(Smallbin是否已空){ if (tc_victim != 0) //成功获取了chunk { bck = tc_victim->bk; //在这里bck是fake chunk的bk //设置标志位 set_inuse_bit_at_offset (tc_victim, nb); if (av != &main_arena) set_non_main_arena (tc_victim); bin->bk = bck; bck->fd...
tcache的发展历程
tcache的发展历程前言经建议,笔者打算参加一次xctf 的分站赛,为此开始备注。遂开始复现往届比赛赛题。先从这次sekaictf-2025开始。这是从第一题开始的分析与延伸。 tcache的引入及更新2.26-2.27首先,tcache 在glibc 2.26 版本登场,其目的是为了加快堆块的管理。因此在没有作安全的检测,也为之后的利用埋下了隐患。 相关源码123456789#define TCACHE_MAX_BINS 64typedef struct tcache_perthread_struct { char counts[TCACHE_MAX_BINS]; /* 0x00 */ tcache_entry *entries[TCACHE_MAX_BINS]; /* 0x40 */} tcache_perthread_struct; /* 总长 0x290 */typedef struct tcache_entry { struct tcache_entry...
HXCTF-2025-决赛彩蛋
bo0k_storeida分析先用checksec 看了一下保护机制–全开 mian函数1.可以看到,会循环调用menu,进行选择进入不同的book_store.2.当v3=1668508013时,是另一题的彩蛋,不用管他。3.按照1 2 3 的顺序依次查看各个选项的内容。 选项1–b0ok_store1.两次输入0x19字节。为什么呢?熟悉的同学可能会想到,第一次覆盖canary高字节,然后再改回去。所以这个地方是留个我们泄露canary的。应该是的2.同时注意到这个b0ok_times,它的初始值为1,所以只有一次机会利用这个选项。 选项2–b00k_store1.熟悉的格式化字符串漏洞,8字节的大小还是太长了,可以泄露很多东西。2.具体怎么使用还是需要动调看栈上有什么数据可以泄露。3.这题目是开启了所有保护机制,所以极有可能是用来泄露pie 和 stack...
HXCTF-2025-pwn
finalalongropida分析1.打开第一眼,左边函数特多,加载特慢。静态编译的文件2.如图框出部分,提示ROPchain。同时0x256字节的输入,显然是ROP。3.最后,标记出偏移是0x40+0x8 gdb & ROPgadget 分析ROPgadget --binary alongrop --ropchain使用命令查看一下ropchain 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990- Step 5 -- Build the ROP chain#!/usr/bin/env python3# execve generated by ROPgadgetfrom struct import pack# Padding goes herep =...
sekaictf-2025-pwn
sekaictf–pwn复现前言备战下一场xctf分站赛 speedpwn-2这是一道tcache 利用的题目,赛后复盘是有源码的,但我们这里还是从写题的角度进行一个分析 ida分析 main 函数 首先申请了0x190大小的堆块作为一块画布, 然后循环进行操作. 每次循环的开始会调用print_canvas 把画布的内容打印出来,然后用户可以输入p,r,h 进行对应的操作 p , 修改堆块的一个字节 r , 重新申请堆块 h , 打印操作的说明 图1 就是 r , 对应的操作 图2 这里是p , 对应的操作.在75 行这里,就是一个明显的溢出漏洞. 因为这里没有对范围的检测 , 所以我们可以输入非法值 , 去修改不在这个堆块范围内的堆空间的值 . 思路分析题目环境是 2.34的libc 首先是泄露libc . 题目没有开启ALSR和FULL RELRO , 可以从ida里获取函数plt的地址 , 同时可以修改got 表 . 首先 , 利用 溢出漏洞 , 修改 tcache_perthread_struct 的 counts 和 entries, 把 .got表...
湖湘杯-2021-house of emma
湖湘杯-2021-house of emma前言学习house of emma 的过程中找到了他的出处,遂体会 静态分析因为网上的题解(应该是出题人的分享),重点在说明house of emma 这个手法的利用链.但是自己在写题还是不能忽视其他的步骤 当然,每个函数都分析的话,有些浪费笔墨,所以我也只会分析我觉得重要的地方. main 其实,刚开始看到这也只是看到,一次读入了0x500字节,也不知道是干啥. 在看完menu函数之后,才反应过来程序的一个流程. 这里的while(1),让程序一直循环. 包括在menu里,也是一直循环,所以这里没有常规的方法可以触发exit().而且这里,所有的opcode,都是一次输入. menu 这里主要是要确认opcode的格式, 每个opcode第一个字节是选项,然后是idx,add()和edit()需要size,edit()还需要content 在这里的case...
Nepctf-2025-pwn
Nepctf–pwn复现timesmallbox查看沙箱题目名字和描述都很明显,拖下来首先就是看一下沙箱。发现只允许一个syscall,ptrace。之前也没遇到过这类题目,先去了解了一下。 ida分析先用mmap分配了一块空间,并给了可读可写可执行的权限。然后fork,然后read,然后上沙箱。最后会调用shellcode。 思路1.沙箱禁用了其他函数,只能使用ptrace 操作。可以获取子进程pid,所以可以操作子进程。 因为沙箱再后面install ,但是子进程出来一直在循环,所以还没装沙箱。 2.利用ptrace修改子进程rip,使其跳过沙箱。同时通过ptrace 往子进程的空间中写入shellcode ,最后让子进程跳转到这,因为没有沙箱,所以子进程就可以getshell。 exp当时写的时候,没有通过ptrace,去往里写,以为父进程中读入的shellcode,子进程也有。反复尝试了很久,都失败了。还以为是attach 失败,又或者是改rip错了。后面意识到,一个点,父进程中输入的shellcdoe...
N1ctf-2025-pwn
N1ctf-2025-pwn前言ez_heap静态分析struct: 1234567struct my_struct{__int64 name_size;__int64 conten_size;char name[16];__int64 heap_addr;__int64 arry_addr;} 其实是用一个大堆块,每0x30 用来保存一个堆块的相关信息。 每次add,会申请新堆块来保存content 在这里发现,可以通过*a3 造成一个uaf 漏洞,配合后面show()可以泄露出main_arena,那么就拿到了libc. 但是进一步发现,edit和show 都只能使用一次,而且 *a3 为0 时,delete 会返回到v7(由用户控制),但是我们没有任何地址信息. edit的scanf 虽然有溢出漏洞,但是\x00 截断的问题还是没有解决.如果可以知道pie ,我们可以覆盖heapaddr 为got...
moectf-2025-pwn-fmt
fmt前言一个平常的下午,学妹让我帮忙看看题。起初我不以为意,吃完晚饭才开始看。然后就写到了1点钟。感觉自己的思路还是太丑陋,不优雅。于是想起了一个格式化字符串的极限利用。一次有趣的格式化字符串漏洞利用 | ZIKH26’s Blog开始研究 ida分析main函数 功能非常的简单, 循环3次调用talk,需要控制flag的值(后续再看) atk判断,成功则调用he() 先看he()里有啥。 he函数 这里建议看汇编, system的出现,让人思路开朗 command是-0xe,也就是要控制rbp-0xe 注意lea 和 mov 的区别,通过这个方法的话,必须要把”/bin/sh”写在栈上 一般揣测一下出题人的想法,肯定是最后要返回到这里了。 talk函数 重点来了, 非栈上格式化字符串,每次只读0x20字节 flag初始是0,talk会把它变成1,想办法置0 返回到了my_read,继续追踪 看看bss段上,这些变量的位置 atk在flag上面,那么就可以利用my_read把flag设置成0...

