2020 byteCTF,题量不是很多,但是其中有两道之前还没有碰到过的类型 go Pwn
和 Android Pwn
,其余两道是传统题目。
gun
程序分析
由于给的二进制文件把符号信息给删掉了,所以逆向时花了一点时间搞清楚 Delete
函数和 Load
函数的功能
Load
函数是将需要删除的节点,连接起来。有一个头指针 chunk_ptr
,指定链表头。如果chunk_ptr
为空时,会直接将需要Load
的chunk
地址加载到 头指针,但是注意此时,没有对该节点chunk
的 next
指针赋值。只有当 chunk_ptr
不为空时,才会对 next
指针赋值。
delete
函数会从 chunk_ptr
开始删除 用户输入的个数,每次删除会清空节点的使用 flag
。但是注意并没有对 节点的 next
指针进行清空。
create
函数也只会将节点的chunk
地址赋值,并不会对next
指针操作。
利用分析
1.通过Load将所有节点连接起来,chunk2->chunk1->chunk0。
2.Delete 所有节点,此时 chunk_ptr
为 0,但是每个节点的 next
指针不变;
3.再create几个节点;
4.再次Load时,第一次Load的节点chunk0的next指针会保存上一次Load时的节点地址chunk1
,我们再次 Load chunk1
,此时chunk1
的next
指针指向了 chunk0
。也就是链表形成了循环:chunk1->chunk0->chunk1
。我们就可以通过删除3次,造成double free 攻击。
由于是 Glibc 2.31
,所以对 tcache 采用 double free 行不通,我们需要将 tcache 填满,使用 fastbin attack。
Tips
关于 glibc
2.31 的 setcontext
用法,由于 setcontext
变为了 rdx
,所以需要先利用一个 gadget
来将 rdi
赋值给 rdx
,再去 执行setcontext+61
。
选取的 gadget
如下:
1 | 0x0000000000154930: mov rdx, qword ptr [rdi + 8]; mov qword ptr [rsp], rax; call qword ptr [rdx + 0x20]; |
需要重新构造一个 sigframe
,写了个函数,以后直接调用就是了,不用再算偏移了:
1 | def magic_frame(rdx_rdi, secontext_addr, rdi, rsi, rdx, rsp, rip): |
EXP
1 | from pwn import * |
easyheap
程序分析
在New
函数中,先读取用户输入的size
,并传递给 size1
,如果 size
不满足要求会一直要求用户输入正确size
。然后根据 size
分配堆块,并读取用户输入,但是 在最后 使用 size1
将 chunk_ptr+size1-1
的位置置为了0。
如果我们从第一次 输入的size
过大,此时 size1
就会过大,而后续并没有再对 size1
进行赋值。也就是我们存在一个 可以向 chunk_ptr
下面地址写 x00
的漏洞。
利用分析
- 利用这个
x00
覆盖 tcache 的 next指针使其指向 tcache_perthread_struct
我们可以通过堆块构造 chunk1
, chunk2
, chunk3
,并且chunk2
的地址最后一位为 x00
。 然后依次 释放 chunk1
,chunk3
,chunk2
,随后申请 chunk1
,并利用漏洞修改 chunk3
的 next
指针倒数第二字节为 x00
,那么我们就有 1/16 的机会将 next
劫持到 tcache_perthread_strcut
。
后面就是先释放 tcache_perthread_strcut
到 unsortedbin
来泄露地址,getshell。
EXP
1 | from pwn import * |
leak
当时搜了很多 Go pwn
的题目,觉得这道题应该是有原型题,但是找了很久都没发现。赛后才知道这道题是被提交过的 Go 编译器编译优化时的产生的数组越界访问错误。可以直接在 github
上搜到这个 issue
。
然后,根据issue
上的代码,可以直接在 这个网站测试,可以发现确实是存在 数组越界访问,hack
中的数组由于在栈上处于 main
的低地址处,所以向下访问时可以访问到 main
中的 flag
。
1 | func hack() { |
Android Pwn
程序分析
利用分析
EXP
- 本文作者: A1ex
- 本文链接: http://yoursite.com/2020/10/25/2020-byteCTF/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!