CTF-浅尝64位栈溢出PWN

干了一早上终于把这道’难题’做出来了,实在是不容易。头一次完完全全的做出64位的pwn题,如果就栈溢出来说的话,其实感觉和32位的也差不多。至少这方面没有遇到太大的困难,做64位的题对汇编指令的要求就更高了。正好一边做题,一边多学点汇编。
收获是很大的。


正文

刚开始被一个逻辑漏洞cmp给卡着,一直没有跳到真正产生漏洞的地方,好不容易跳过去了,结果被我自己坑了(写脚本的时候,没有考虑缓冲区的影响,经常得不到自己想要的结果)。。几经周折终于调试正确。剩下的就是构造rop链,由于是静态编译,这一点也没什么难度,只要知道syscall对应的中断号和参数即可。
最后跌跌撞撞总算是get shell了。
在这里还是和大家分享一下,那些年我所犯下的错。
习惯性的检查。
这里写图片描述
开了栈保护,那就很难去通过栈溢出覆盖返回值了。
自己运行一下程序也没什么特别之处。
IDA看看,是个静态编译的程序
。。这里有小技巧,如果不说下可能还真不知道。有时候IDA没有把这段代码识别为一个函数,我们可以手动右键create function(忘记截图。尬),之后再反汇编。(我自己都给忘了,直接看汇编给整出来的。汗!)
这里写图片描述
反汇编之后这个逻辑就比较明显了,通过一个cmp我们进入到game这个函数
这里写图片描述
再看看formatformat都是什么
这两个都在data段,并且可写。大概就是怎么写,写什么的问题了
漏洞大概找到了。接下来就是调试阶段。比较痛苦~!
先想办法把cmp给绕过。
这里写图片描述
我们先照着逻辑写一下。可以知道rdi是第一个参数,rsi是第二个参数。
有关64位怎么传参可以参考这篇文章

http://www.linuxidc.com/Linux/2013-09/90063.htm

再看看此时寄存器的值。咦不对。进到cmp里面看看。
这里写图片描述
这个才是真正的cmp函数,此时寄存器的值才是真正的参数。
这里写图片描述
只需要使相应的值为’\x00’即可。我建议是多看看汇编,这就不用猜了,直接算偏移量。
这里写图片描述
正确的结果是ZF为1。这是个零位标志寄存器。
有关标志位寄存器,可以参考下这篇文章。

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值