首页
社区
课程
招聘
[原创]WarGame-narnia7 解题思路
发表于: 2019-8-1 15:13 9185

[原创]WarGame-narnia7 解题思路

2019-8-1 15:13
9185

Narnia7源码如下

在vuln函数中看到了很多printf函数,这是强烈的暗示我们要用格式化字符串漏洞去修改ptrf的指针指向hackedfunction函数,由于上次narnia5中我学习格式化字符串参数并不详细,所以这里花了很久去理解格式化字符串中的参数的作用和意义,再次推荐irc.overthewire.org这个IRC,这里的人很强并且很有耐心,只要懂英文,就没啥不能解决的;言归正传,为了理解各个参数的作用,我写了几段代码,第一段如下

运行结果如下

%n将p从0xffffffff修改为5,其原因就是%n并不是将字符串’hello’写入p,而是将’hello’所占的内存的大小写入p,第二段代码如下

执行结果如下

%hn的意思就是高四位不修改,只修改低四位,注意,这里的5是十进制的,并非十六进制的,所以我们在写入数据到指定位置的时候也必须将数值计算成十进制然后写入,回到narnia7,想利用格式化字符串有三件事儿必须要明白,1、要写入的地址;2、要写入的地址在栈上的位置;3、要写入的数据内容;程序执行如下

要写入的地址为0xffffd668,要写入的内容为0x8048724,因为我们要修改的地址前四位都是0804(32位系统下地址都是8位的),所以会用到%hn,最后要得到ptrf在栈中的位置,gdb调试结果如下

断点下在snprintf函数,运行后断下,看到0x080486ff处于0xffffd628的位置,因为源码中snprintf传入的有三个参数,所以这个位置就是%01n的位置,如果尝试写入值的话,就会发现写到了0xffffd62c的位置也就是%02n,最终利用结果如下

小结

内容中的地址有些前后对不上,是因为wargame的ssh连接并不稳定,总是断开,重连以后地址就完全不同了,所以前后不同

歪果仁的耐心还是不错的,会从很基础的位置开始教起(这里没有崇洋媚外的意思),但是国内论坛的大佬们显然就没有这个“时间”了O(∩_∩)O哈哈~ ,这里我之所以重新讲格式化字符串是因为我在开始学习之初也对这个东西非常不理解,这直接导致了学不下去,我当时就不能理解就代表了也有新人很不理解,所以我就从HelloWord开始讲起

wikipedia对于格式化字符串的解释

附件是可执行代码和源码

版主,我解说的这么详细,不给个精华么o(╥﹏╥)o


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 1
支持
分享
最新回复 (3)
雪    币: 242
活跃值: (89)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
感谢分享,%02hn的02没弄明白是什么意思。

windows上的msvcrt.printf好像没有%n功能。
如果要写入的地址中正好有0x00,构造不了"format"
2019-8-5 16:56
0
雪    币: 14517
活跃值: (17538)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
3
pull 感谢分享,%02hn的02没弄明白是什么意思。 windows上的msvcrt.printf好像没有%n功能。 如果要写入的地址中正好有0x00,构造不了"format" ...
02的意思是目标地址所在的栈的位置是第二个
这些游戏全都是在Linux下的,Windows的暂时没找到
0x00这种情况我遇到过一次,不过还好是在我的机器上,如果在narnia server上的话就GG了
2019-8-13 17:55
0
雪    币: 14517
活跃值: (17538)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
4
pull 感谢分享,%02hn的02没弄明白是什么意思。 windows上的msvcrt.printf好像没有%n功能。 如果要写入的地址中正好有0x00,构造不了"format" ...
02的意思是目标地址所在的栈的位置是第二个
这些游戏全都是在Linux下的,Windows的暂时没找到
0x00这种情况我遇到过一次,不过还好是在我的机器上,如果在narnia server上的话就GG了
2019-8-13 17:55
0
游客
登录 | 注册 方可回帖
返回
//