最近做了vm的pwnt题才发现Vm的pwn题是真的有意思,做vm的关键在于逆向,我的逆向太菜了,逆的太慢了,做题速度直接与逆向速度挂钩,导致就做出来一道题,哭了。随便提一句有的没的,广州是真的好,主办方是我见过最良心的主办方,大气+多金。还有一道关于json的pwn,我实在是做不出来,就不写了。
0x01粤湾中心
这一道题比赛现场没时间做,我的逆向太菜了,当时只看懂了一个大概。赛后也想向其他师傅请教了一下。
首先拿到这道题看一下开启的保护
Arch: amd64-64-little
RELRO: Full RELRO
Stack: Canary found
NX: NX enabled
PIE: PIE enabled
这一道题不能直接getshell,因为开启了prctl,禁用了execve
1 | ================================= |
这一道题最初打flag文件,然后将fd重定位到了0x233这个地方。所以我们解这一道题的主要思路就是将fileno的值改为0x233,然后当程序读取输入的时候,自动去0x233这个地方读取输入,然后再将输入打印出来,刚好本题结尾处就有这样的条件。
1 | printf("Could you tell me your name?"); |
所以我们现在只需要将fileno该为0x233就可以了。
这一题提供了加减乘除等等指令。这个题的漏洞就是在读取寄存器的时候,没有对索引值进行检查,导致了越界读写。因此将栈地址改为fileno的地址,通过入栈操作就可以将该题fileno修改了。不过计算起来贼麻烦,我没有自己算,哈哈哈哈哈哈哈 ,贴一下其他师傅的脚本吧。
下面脚本是ditto师傅的,他的博客链接:http://dittozzz.top/
1 | #coding=utf-8 |
0x02 粤湾银行
这是一道32位的pwn,比赛的时候没逆清楚,赛后复现出来了。
开启保护:
Arch: i386-32-little
RELRO: Partial RELRO
Stack: Canary found
NX: NX enabled
PIE: No PIE (0x8048000)
该题的结构体
1 | 00000000 Vminfo struc ; (sizeof=0x2C) |
这一题用到了三个指令。这一题有三个指令可以达到任意地址读写。
1 | def movimm(reg,imm):#将立即数放到任意寄存器 |
通过上面四条指令可以达到任意地址的读写
我的思路是首先将got表泄露出来,然后劫持free的got表,从而达到getshell
当然,VM是很灵活的解题,解题思路不止一种,因为我只用到了他为数不多的几个指令,还有其他完全不同的思路解题。这就是我喜欢VM的原因,全靠自己逆向,自己的自由度很高,这一题还有一种思路就是通过寄存器的越界读写,修改存放栈的地址,改为got表,也能达到劫持got表的目的,这个想法应该是可行的,就和第一道题的思路类似。
我的exp:
1 | from pwn import * |
关于怎么防守,说实话,我是没怎么想清楚怎么去防守。因为利用点太多了,真的很困难。
0x03 粤湾证券
这道题是一个攻守兼备的一个VM,根据他提供的VM 来进行逆向分析他的指令集,然后再通过你提供的defense脚本和payload来进行一个攻守兼备的一个模式。
首先看一下这一题开启的保护
Arch: amd64-64-little
RELRO: Full RELRO
Stack: Canary found
NX: NX enabled
PIE: PIE enabled
这一道题很无脑,因为它调用了dlsym,通过这个函数可以直接调用system。不过当时在现场不太了解这个函数,并且没有外网环境,并不知道这个函数用法。对这个函数进行盲测花了很长时间导致其他题没时间做了。这个函数把libc当做handle,第二参数为函数名称的字符串,就会返回函数的真实地址。所以这道题一点都不难,不过可惜在于当时一直以为是函数在libc的偏移量作为函数第二个参数,返回函数真实地址。
我的exp:
1 | import base64 |
我的编写defense的脚本:
1 | from pwn import * |
个人觉得,这个题是最好玩的一个题,希望以后的比赛多来点这种题。不是因为简单,而是因为这个题这种攻守兼备的模式。以题目作为媒介,自己编写攻击和防御脚本来进行对抗,这一点我特别喜欢。不像传统的AWD,通过去修改文件,来修复漏洞,那样少了许多攻击灵活性,但是也不像前道VM题攻击的那么灵活,让你修的无法下手,增加了许多防守的稳定性。