[BUUCTF]PWN [HarekazeCTF2019]baby_rop2

10 篇文章 0 订阅
本文详细介绍了如何通过分析程序的main函数发现溢出漏洞,并利用ida进行逆向工程。通过填充栈并利用printf gadget泄露libc基址,最终实现/bin/sh的调用来获取flag。学习了如何构造payload,包括覆盖ret地址和使用格式化字符串技巧。
摘要由CSDN通过智能技术生成

惯例
惯例checksec发现开了,但也没开。
打开IDA进行分析
在这里插入图片描述
main函数很简洁,也没有内套其他函数。有一个很明显的溢出漏洞,可以通过read函数来把♂栈♂填♂满。那么如果我们把ret地址填写成我们想要的函数,就可以对他进行调用。看看本题题目,名副其实了属于是。

很明显,我们可以使用printf函数泄露libc基址。
printf函数的形式大概像这样:printf(“%s“,Moriarty),其中格式化字符串是第一个参数,放在rdi中,第二个参数放在rsi中。很明显的,我们应该想办法把rdi覆盖成一个格式话字符串,然后把rsi覆盖成我们想泄露的地址。
在这里插入图片描述
使用gadget工具,找到了一个pop rdi指令。
在这里插入图片描述
再使用gadget工具,又找到了一个pop rsi,只是后面跟了一个pop r15.没关系我们可以任意对其进行填充。然后再ret到printf函数即可。

我们要找一个格式化字符串来当填充rsi,很容易找到
在这里插入图片描述
接下来构造payload如下:
在这里插入图片描述
通过libcsearcher得到libc基址
在这里插入图片描述
接下来将rdi府改为/bin/sh,syscall便可。

学到一个小技巧,接收地址的时候可以用下面这行代码:
在这里插入图片描述
最后得到flag
在这里插入图片描述
我在想,是不是可以不用文件里的格式话字符串,通过自己写入一个%s,再通过确定偏移找到他在栈里的位置。下次可以试试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值