Bugku pwn5

我怀着沉重的心情写这个blog,在我做出这道题之前费劲了千辛万苦,花了三天时间,思考加发呆加询问…
菜就不用说了。
好好记录一下吧。在这里插入图片描述

代码中存在格式化字符串漏洞,具体运行起来是这样

在这里插入图片描述

这是第一个坑,%x与%p是有区别的,x输出四个字节,p输出八个字节,这是64位的程序,所以地址应该大于四个字节了。
之前一直用的%x最后泄露出来的地址不对,也很难发现。
(菜+1)

为什么是%11$p呢,这要从printf格式化字符串函数说起:
由于格式化字符串漏洞通常都是因为程序猿偷懒,函数写成printf(s)这样的,所以程序就把s当作格式化字符串了。加载printf函数之后,输入的字符串被加载在栈中的一个位置,由于又是格式化字符串,所以它的地址被压入了栈顶(这个具体的不太清楚),然后每遇到一个格式化字符,就在栈里向下找一个参数,按相应形式输出,如此进行。
不过在六十四位中又不太一样,64位系统中前六个参数加载到寄存器里,所以第七个参数才加载到栈中。

在这里插入图片描述

进入了printf函数里看见了__libc_start_main 这个函数,由于这道题没有现成的system函数,所以要泄露目标机器的libc地址,根据偏移找到system函数,和bin/sh字符串,

然后程序还开启了NX保护,所以要ROP,找到跳板跳到一个pop rdi ,ret 命令。基本思路就是这样。

ROPgadget --binary bugku-pwn5 --only "pop|ret"

下面第二个坑,

之前一直用kali64做题,我用这个虚拟机调试这个libc_start_main函数内的偏移死活就是235,我就陷入了苦苦追寻思考。
为什么啊
后来知道每个机器默认值下都是有一个libc版本,这个kali是2.28的,看网上的wp里面是2.23,我…
然后再看网上推荐用Ubuntu1604做pwn,安装好了之后才行…

目标机器的libc是2.23,我的kali是2.28,所以调试的时候用的是我的机器编译链接,函数偏移自然不一样。(其实我也不知道Ubuntu1604为啥行,可能大部分是这个版本吧)。
听同学说泄露libc基址是个专题,以后基本都不会给版本,所以以后慢慢积累吧。(菜+2)
不要吐槽背景...
这是python脚本,说到这个。。。
第三个坑,我不知道如果python里要有中文的话要加上
#coding = utf-8
。。。可能之前没有遇到过把
记住记住。。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值