数字经济云安全共测大赛初赛
前言
是第一场正经打的线上赛,上午做了俩题就去线下了(线下被暴打,不过那是另一个故事了)。前两题比较基础,第一题甚至混了二血,第三题是seccomp的题目,最近第二次见了,感觉很综合,今天花了一天做了出来(在17的提示下orz)。
amazon
漏洞利用
libc 2.27,check的时候double free,Show有UAF,Free(0x80)*8泄露libc,分配的时候先把这个unsorted bin分成chunk1和chunk2,再分配0x80的时候走tcache拿到和之前Unsorted bin一样的块,再从0x20处写实际上可以写chunk2的fd,修改到malloc_hook-0x28,从而可以写realloc_hook和malloc_hook,调整偏移即可get shell
exp.py
1 | #coding=utf-8 |
fkroman
漏洞利用
没有泄露的常规题,libc 2.23,这个题又有double free又有堆溢出。。有点可利用地方太多手忙脚乱的感觉,最后磨磨蹭蹭跑出来了算是。
exp.py
1 | #coding=utf-8 |
dark
程序逻辑
开始有个seccomp限制系统调用,程序保护没怎么开,main函数里有一处极大的栈溢出。
1 | __int64 Init() |
1 | [*] '/home/ctf/Desktop/CTF/gongce/dark1/dark' |
seccomp-tools看下具体限制,只能执行open、read和mprotect系统调用1
2
3
4
5
6
7
8
9
10
11
12 line CODE JT JF K
=================================
0000: 0x20 0x00 0x00 0x00000004 A = arch
0001: 0x15 0x00 0x07 0xc000003e if (A != ARCH_X86_64) goto 0009
0002: 0x20 0x00 0x00 0x00000000 A = sys_number
0003: 0x35 0x00 0x01 0x40000000 if (A < 0x40000000) goto 0005
0004: 0x15 0x00 0x04 0xffffffff if (A != 0xffffffff) goto 0009
0005: 0x15 0x02 0x00 0x00000000 if (A == read) goto 0008
0006: 0x15 0x01 0x00 0x00000002 if (A == open) goto 0008
0007: 0x15 0x00 0x01 0x0000000a if (A != mprotect) goto 0009
0008: 0x06 0x00 0x00 0x7fff0000 return ALLOW
0009: 0x06 0x00 0x00 0x00000000 return KILL
漏洞利用
这道题前半部分是0CTF的Black hole,程序里查gadgets查不到,但是got表可写,alarm+0x5的地方是syscall,csu把其低字节写改成syscall我们就有syscall用了,用read的返回值修改rax=0xa,调用syscall修改bss为rwxp,由于系统禁了write,我们栈迁移之后只能open和read,无法显示flag,请教17学长之后得知新的方法,单字节cmp爆破,根据结果jz到read,此时程序会阻塞等待输入,而其他情况下程序执行非法指令出错结束,以此我们可以一个字节一个字节地爆破flag,最终拿到完整flag。
exp.py
代码写的有点差。。目前只能人工看阻塞情况,之后ctrl+c打印目标字节,再手动修改偏移得到下一字节。
1 | #coding=utf-8 |