TQLCTF2022-ezvm-WP
上周末参加了奇安信和 Redbud 一起组织的 TQLCTF,pwn 题的质量挺高,都挺有意思的,我在比赛期间尝试做了 unbelievable_write,ezvm 和 trivm-string 三道题,做出两题。其中 unbelievable_write 是一个传统的堆题,free 掉 tcache_prethread_struct 然后 add 即可控制该结构体实现任意地址分配,分配到 free@got 处修改为别的函数即可避免 free 非法堆块导致报错,然后再分配到 target 处覆写即可获得 flag。很简单,就不写 wp 了。然后 trivm-string 这题,三进制平衡虚拟机,确实很有意思,逆向队友帮忙写了一个反汇编器,可惜分析的稍微有点问题。本来的思路是还原栈帧并理清输入流程找到溢出点,但是由于反汇编错误丢失一些 label,看了一会儿还是放弃了。之后准备学习一下反汇编器开发的技巧,再看看能不能写个该虚拟机的反汇编器。
…
写在大二上结束
又是很长时间没有更新博客了,前段时间各种事情比较多,没有学习什么东西,也就没办法输出成文章,寒假期间也有场 HCTF-game 再办,所以一直没法空下来,这个惯例的期末总结也是拖到了寒假快结束才开始写。回想一下上个学期,说来惭愧,感觉也没学什么东西。
…BYTECTF2021-byteview
漏洞分析
比赛的时候分析了很久这道题,结果也没做出来,现在想想主要 C++ 逆向不熟悉。
在 new content 时,如果之前已经 new 过了,就会进 case1。
case 1u: // new content
v17 = *(_QWORD *)v5;
if ( *(_QWORD *)v5 )
{
v21 = *(_QWORD *)v5;
v7[6].m128i_i64[0] = (unsigned __int64)menu ^ v17 & 0xFFFFFFFF0000LL;
v7[6].m128i_i32[2] = *(_QWORD *)(v17 + 32);
v18 = (struct uniq_ptr_task_req *)operator new(0x18uLL);
v18->choice = 1; // 另外一种 add 的情况
ref = v18;
*(__m128i *)&v18->old_content = _mm_unpacklo_epi64((__m128i)v21, (__m128i)(unsigned __int64)v7);// old content
}
这里面有个 v18->old_content,引用了上一个 content。
…