0x0 前言
这次的pwn基本上都是vm pwn,虚拟指令集,这类题代码量大,需要逆向时间长。但做这类题的关键点在于找到虚拟机中和真实环境的交互点,找到可以泄露真实地址的方式之后这种题基本就稳了。
0x1 boom1
1.1 题目分析与解题思路
这道题就是一个语言解析器,也就是你输入什么代码就执行什么,但是函数只能用一次。
而这道题逃逸的突破口在于它可以用程序里的变量来泄露它真机中的真实地址。
解题思路是用它自身的变量来获取libc,然后打exit_hook即可。
1 | from pwn import * |
1.2 libc位置情况下的偏移爆破
由于libc版本未知,远程偏移未知,所以需要爆破偏移,从-99到99爆破,从网上找到了别人爆破的脚本,学到了新的知识。
1 | if __name__ == "__main__": |
0x2 boom2
2.1 分析题目
首先用malloc分配了两块内存,分析后得出一块是栈,代码段,分析前面这块的行为,它把真实的栈地址push到了虚拟的栈中,这里是突破的一个关键点,提供了我们突破虚拟机的限制来与虚拟内存之外进行交互。
然后看下图,我们输入的内容是进入到buf中的,也就是代码段,然后程序对我们的输入进行取址,译码。
再下一步就是根据取到的指令进行执行
经过分析以后可知,各操作数对应的指令为(带imm的指令就是有一个原操作数是立即数)
1 | 0 imm: temp = ebp_now + imm |
2.2 解题思路
- 先用14指令pop一下,这个时候temp中存的就是真实的栈指针了
- 再利用1指令和26计算出返回地址的位置,13来把计算结果存到栈上
- 用9指令获取返回地址里的内容(libc_start_main+231),然后再用13保存到栈上
- 利用1和26计算libc基址,然后再用13保存到栈上
- 利用1和25计算onegadget的偏移
- 最后利用11把onegadget写入返回地址
2.3 exp
1 | from pwn import * |
0x3 faster0
这个题,乍一看要做一百次选择,然后最后进入func100,有一个很简单的栈溢出,最笨的方法就是一个一个把100个都过了,也可以。但感觉会有更简单的方法,比如是不是能让atoi返回大于10的数,然后一直走func000,然后再直接跳到func095,不过自己没有实现。放一个学弟写的脚本。
1 | from pwn import * |