VM pwn
前言
第一次做VM pwn,虽然全程是跟着诸多大佬博客走的,但总得还是个里程碑,在pwn的路上走的更远了一些。pwn👶也想变成pwn👴,不知道这天还有多远~
wp来源:
https://blog.csdn.net/A951860555/article/details/117214601?spm=1001.2014.3001.5501
https://www.cnblogs.com/lemon629/p/13975686.html
https://blog.csdn.net/seaaseesa/article/details/105862737
https://zhuanlan.zhihu.com/p/257132453
[OGeek2019 Final]OVM
题目来自buuoj
常规checksec一下,64位,stack没开
主函数的代码审计
fetch函数的话,取出pc指向的指令,并自动加1,指向下一条
execute函数的代码审计,下面是根据代码整合出来的指令表
1 |
|
1 |
|
结合汇编一起看,可以发现,数组下标没有禁止为负数的情况,所以是可以向上访问到got表,从而把函数地址放入寄存器中,获得函数地址。但是这边要注意,寄存器跟内存是4字节的,而泄露的地址是6字节的,、所以要用两个寄存器分别存放高四字节和低四字节
然后就是退出execute时,会往之前申请的堆块里面写入内容,再释放掉。但是因为这个堆块的地址是存放在.bss上的,在上面的数组越界同样可以修改,所以可以改为free_hook - 0x8,改为这个是因为我们要释放得是一块含有/bin/sh的堆块,所以要先有位置填充/bin/sh,然后再写入system函数。
声明:我下面的图都是忘了-0x8的,后面懒得再截图了
可以看见,一顿操作后,寄存器上确实存放了一个libc地址,计算与free_hook的偏移即可
然后通过0x10一个字节一个字节的加,最终改成free_hook
跟第一步一样,把free_hook地址写入comment
然后就是输入/bin/sh以及system函数,即可getshell!
成功!
1 |
|
总结
所谓VM pwn,就是模拟虚拟机的底层运行机制,大逻辑上拥有内存、寄存器,内存细分还有堆栈等等,以及自己的一套指令集,所以如果就算碰到不是上面的给了符号表的,也可以通过这个大逻辑自己进行理解性的还原代码,使得代码更好阅读。这类型的pwn题难点更多就是在于代码逻辑的理解,知道指令集的操作,再找寻里面出现的漏洞,要具备十足的耐心,毕竟现在2021的题目肯定比上面复杂很多很多。
然后呢在分析虚拟机实现了哪些指令时,可以从下面两个大方向入手:首先找到虚拟实现的内存以及寄存器,比如程序可能单独malloc几块内存用来当作寄存器或者栈空间,亦或者就用全局变量来实现;第二步就是读代码逻辑,分析指令。有字符串,可以直接根据提示的字符串识别;没有字符串,则根据指令操作码
和操作数
构成,操作数的个数还可分为一操作数指令、两操作数指令以及三操作数指令等概念加入到代码逻辑的阅读中,帮助我们快速分析和理解。
最后在调用寄存器进行布局getshell时,最好是要把代码中的指令进行整合,就像上面整合的一样,这样可以在写脚本,迅速知道操作码的取值以及操作对象的值
然后,加油!
- 本文作者:ShouCheng
- 本文链接:http://shoucheng3.github.io/2021/10/04/2021-10-04-VMpwn%E5%85%A5%E9%97%A8/index.html
- 版权声明:本博客所有文章均采用 BY-NC-SA 许可协议,转载请注明出处!