Java pwn_虚拟PWN初探

前言

之前看到星盟Q群里面的消息,Freedom师傅在B站直播关于虚拟pwn入门的公开课,然后就去听了一波,感觉受益匪浅。之前一直以为虚拟pwn是超级复杂的东西,今年打比赛也遇到了好几次,一直无从下手。所以借着公开课学到的内容,复现了去年国赛虚拟pwn的那道题。这里写一篇博客记录下来,当作自己博客园的第一篇技术博文吧!主要是为了水周五的分享会

漏洞分析

就像Freedom师傅所说的,虚拟pwn的难点不是在于漏洞的利用,而是在于漏洞的分析,在于逆向分析能力。首先说明一点,这里我是直接在网上搜到了一个已经逆好的i64文件,自己跟着去逆向了一波。虽然感觉那位师傅逆的还是有点小瑕疵,但是u1s1,这么大的工程量,给我自己单独从头逆的话,真的逆不了这么清楚(留下了没技术的泪水)。

先在虚拟机运行一下:

7f830b0ac0bc68d7ab9f1a37865097fb.png

从这里可以大致了解程序的功能,就是类似一个虚拟机一样执行我们输入的指令。

然后,直接拉进ida,找到main函数,f5反编译

0f2827348ba6ea01ede09a4ac52b6322.png

可以看到,程序一开始便申请了三个段(利用堆申请出来的),一般虚拟pwn就是这三个段吧:代码段,栈段(运行栈),数据段(缓冲区),所以这个程序也不例外。(代码段主要用来放置我们的伪汇编指令,数据段放置我们一开始输入的数据,运行栈段就是执行add等这些指令时的栈段)

但是作为一个段的话,肯定会需要例如索引,段里面元素个数等信息,所以根据初始化函数sub_4013B4,我们可以重构一个结构体(上图是已经重构完的了)

32be885194939e15f4651ada10fe86cf.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值