count
ARM pwn,虽然本地运行不起来,但是也不需要,直接挂远程就行了,
先是200次循环计算出结果后,输入一串字符处有溢出,将变量覆盖为0x12235612调用后门
exp:
1 | #coding:utf-8 |
MarksMan
直接给了libc,而且有一次任意地址写的操作,可以写3个字节;但是程序保护全开
写操作结束后调用dlopen
,最后退出
所以我们可以修改_rtld_lock
为onegadget
但是这里又有一个问题,onegadget总共3个,前两个栈结构不满足无法使用,而第三个却被作者ban了
这里我选择拆解汇编onegadget = libc_base + one[2] - 5
exp:
1 | #coding:utf-8 |
SecureBox
1 | 1.Allocate |
4个功能,且对于写入的数据会去亦或一组随机数,但是这组随机数在allocate的时候就给我们了,所以这里问题不大,show函数可以泄漏出libc,但是也只有泄漏的作用。过了几篇这些功能函数并没有发现其它漏洞的存在。
这里吸取教训,做pwn的时候不能完全依赖IDA反编译出来的伪C代码;赛后经师傅提醒才发现题目的漏洞点:
在Allocate函数中这一句if ( size > 0x100 && size <= 0xFFF )
这是对 堆块大小进行的判断,这样看起来一点问题都没有,我们回到汇编去看
在检测下界的时候用的是[rbp+size]
,这没问题,但是在检测上界的时候却用eax
,也就是拿32位的寄存器去检测一个64位的值,所以这里就能往上溢出,给一个很大的size,使得malloc返回0,再结合Enc中的Offset of msg
就可以做到任意地址写
exp:
1 | #coding:utf-8 |