by Ainevsia
这次比赛就做出来了一道pwn题和区块链的题目,另外的三道pwn没有什么思路,XD。
把做出来的两道简单记录一下。
hh / Pwn
自定义虚拟机题目,加了seccomp,除了execve其他syscall都可以。
1 | line CODE JT JF K |
一开始想错了,想用他实现的printf进行libc泄露的,但是算了一下sp往上推的时候是会覆盖到原来的值的,sp也之只能是连续变化的,不会跳变,所以这种思路不行。
后来发现有oob
1 | case 0xDu: // assign |
OOB 改rip泄漏libc,ROP执行open read write
1 | #!/usr/bin/python |
catcatcat / Blockchain
contract-library上反编译出的结果真的挺好看的。
反编译结果贴一下
1 | // Decompiled at www.contract-library.com |
0x39b4b0d6这个函数可以重入,因为再调用外部函数之前没有把_done提前修改掉。
合约地址必须要以0x21结尾,用下面这个脚本生成一个。
1 | import blocksmith |
攻击合约
1 | pragma solidity ^0.6.0; |
赛后做出来的题
White Give Flag
出题人说这道题是白给题,不提供libc说明不需要libc。
利用read遇到EOF返回0,read大整数返回负数,进行泄露已经读入程序内存的flag
1 | #!/usr/bin/python |
Little Red Flower
比赛的时候不会做,赛后复现
梳理函数流程:
- 加入seccomp,ban了execve,libc的地址已知。
- malloc 0x200大小的chunk
- 给了任意地址写1字节的能力
- chunk偏移unsigned int的offset oob 写8字节 (显然是top chunk)— 为了让我们在合适的地方布置一个合适的指针。
- malloc 0x1000-0x2000 的chunk, read读入,然后free
Ubuntu GLIBC 2.30-0ubuntu2.2
main函数无法正常return,根据wp,需要在free之前就劫持free_hook。 之后要做open read write
利用的思路是将TCACHE_MAX_BINS设置成一个非常大的数,那么malloc的时候如果对应的count不会零就会从之后越界的地址上返回一个指针给我们。
这道题学会的最亮点的东西是劫持freehook 迁移栈rop
1 | #!/usr/bin/python |
ff
非常明显的uaf,有悬挂指针存在
不得不说,真的好巧妙啊!
进攻tcache_perthread_struct,来获得libc泄露的方法++
牛皮!
1 | #!/usr/bin/python |