mheap
先贴上我觉得最可惜的一道题
程序自已定义了分配原则
1 | struct chunk{ |
并且在程序一开始在0x23330000处申请了0x1000大小的空间当top chunk,以后的每次申请都从这个区域切割
1 | 0x4040d0 --> free列表:free掉的chunk按单链表的形式存放 |
漏洞点:
1 | __int64 __fastcall my_read(__int64 a1, signed int a2) |
最有意思的也是最容易忽略的,当a1+v3超0x23331000时,read返回-1,而!-1 != 1所以可以实现向上读,之后只需要伪造一next指针即可,但是这个伪造块的size在远程似乎很有讲究,最终还是没能找到适合的size
exp:
1 | #coding:utf-8 |
mulnote
程序丑到爆炸,但是就是一个简单的UAF
exp:
1 | #coding:utf-8 |
vip
分析程序可以看到,在edit函数中有个任意长度的堆溢出
1 | ssize_t __fastcall sub_4014A8(void *a1, int a2) |
但是前提是dword_4040E0不为0,否则溢出的也只是不可控的随机数
程序的run函数中调用了prtcl函数,而它的第7个参数刚好能被覆盖到0x30字节,所以可以伪造6条沙盒规则,这里我们把open函数关闭(return ERROR(0)),顺便打开mprotect绕过NX,那么前面提到的open("/dev/urandom")
就会返回0,使得read(fd,a1,a2) == read(0,a1,a2)
,接下来就tcache了,但是因为execve函数被禁用了,所以这里用写shellcode直接读flag。
exp:
1 | from pwn import * |
MISC
betgame
第一关:b –> s ; j –> b ; s – j ;
第二关:j –> s ; s –> b ; b –> j;
第三关:s –> s ; b –> b ; j –> j;
写个脚本跑一通就行了
1 | from pwn import * |
jigsaw
拼图出flag2333
CRYPTO
lrlr
aes随机数漏洞加广播攻击
1 | import gmpy2 |
然后z3解方程
1 | from z3 import * |
REVERSE
驱动逆向
分析下来可以发现是AES加密
1 | char *__fastcall sub_140002DD0(char *a1) |
这里v4是密文 ,md5key是通过伪造的“Fakelntel”分4段进行计算的结果 :key = b”\x52\xa9\x65\x08\xc3\x95\x36\xf0\xc2\x42\x53\x9b\x77\x17\xfb\xc6” IV由题目给出:25 40 5a 86 b5 f1 3e 58 80 9b db 0b 30 49 66 8c
1 | from Crypto.Hash import MD5 |