护网杯pwn——huwang超详细wp

比赛结束快一个星期了,复现了一下这道题,借鉴了一下网上的wp发现大佬们写的都很简略,所以这里写一个详细的wp供小白们学习。

简单记录一些小的知识点

来自于csapp: int open(char *filename,int flags,mode_t mode)这里主要关注flags参数

这里我们将会用到的参数是O_TRUNC

程序逻辑分析

main函数

大致分析一下可以发现程序需要我们输入选项,类似于一个堆的功能。然后如果我们输入666就会进入一个比较重要的函数,我这里将其改名成了important。

important函数

这个函数是让我们输入一个值,会作为文件secret中字符串进行md5加密的次数。然后再让我们输入一个字符串与加密的secret字符串进行对比如果成立那么就进入下一个函数,我这里把他命名为了exploit。

exploit函数

它会先打印出我们在important函数中输入的name(可以leak出canary),然后调用snprintf函数(tips:snprintf函数的返回值是我们输入的字符串的长度),然后下面有一个read函数,read的长度参数是由我们控制的(见上面tips的内容),这里我们就可以进行栈溢出。

解题思路分析

大概的想法就是先进入important函数,再进入exploit函数利用栈溢出getshell

一、绕过important函数中的md5加密

上面的小知识里讲了read函数的参数问题,这里看下文件的read参数flag处为553(这里有一个坑的一点,我之前一直不明白,ida是把O_WRONLY | O_TRUNC进行了抑或后的结果直接显示出来了513,不过可能看客大佬们的ida可能会显示011000这个表示的意思是一样的。)

因为次数是一个int类型可以包含负数,而在对比中第一次和其对比的是int类型而第二次其对比的是个unsignedint类型,只要我们输入-1那么和unsignedint进行对比时会转化为很大的一个数,程序会运行一段时间。这个时候我们开启第二段进程,读取已经被读取的文件secret的时候就会读到'\0'(文件被截断),然后我们再次输入'\0'的md5加密后的字符串就可以成功绕过进入下一个函数了。

二、exploit函数中栈溢出的利用

第一步我们先泄漏处canary的值,具体就是利用第一个printf泄漏处canary,然后利用snprintf输入我们的长度(长度没有限制,只要够我们放我们的rop就可以了)。然后就是很常规的栈溢出,泄漏地址(给了我们libc文件)直接计算偏移,然后利用rop拿到shell

wp总结

题目一路坐下来可以感觉pwn对计算机系统的了解程度还是很高的,不然都不知道md5可以这么绕过。

原文发布于微信公众号 - 安恒网络空间安全讲武堂(cyberslab)

原文发表时间:2018-10-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏代码世界

Python之几种常用模块

模块 注意事项: 所有的模块导入都应该尽量往上写 内置模块 扩展模块 自定义模块 模块不会重复被导入 : sys.moudles 从哪儿...

3406
来自专栏owent

我们的Lua类绑定机制

最近一个人搞后台,框架底层+逻辑功能茫茫多,扛得比较辛苦,一直没抽出空来写点东西。

2841
来自专栏瓜大三哥

文件地址映射之yaffs_GetTnode

yaffs文件系统在更新文件数据的时候,会分配一块新的chunk,也就是说,同样的文件偏移地址,在该地址上的数据更新前和更新后,其对应的flash上的存储地址是...

1976
来自专栏瓜大三哥

Verilog代码设计风格

1.信号命名规则 信号命名规则在团队开发中占据着重要地位,统一、有序的命名能大幅减少设计人员之间的冗余工作,还可便于团队成员代码的查错和验证。比较著名的信号命名...

2197
来自专栏史上最简单的Spring Cloud教程

Openresty最佳案例 | 第2篇:Lua入门

什么是lua Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能...

7849
来自专栏有趣的django

7.python常用模块

time模块 常用表示时间方式: 时间戳,格式化的时间字符串,元组(struct_time) UTC(Coordinated Universal Time,世界...

48411
来自专栏静默虚空的博客

[设计模式]创建型模式

定义 创建型模式抽象了实例化的过程。它将系统与它的对象创建、结合、表示的方式分离。 创建型模式都会将关于该系统使用哪些具体的类的信息封装起来。 在软件工程中,创...

1789
来自专栏阮一峰的网络日志

JavaScript Source Map 详解

上周,jQuery 1.9发布。 ? 这是2.0版之前的最后一个新版本,有很多新功能,其中一个就是支持Source Map。 访问 http://ajax.go...

3435
来自专栏QQ会员技术团队的专栏

JavaScript引擎分析

JavaScript引擎分析 一. JavaScript简介 JavaScript是一种动态类型的脚本语言;在1995年时,由Netscape公司的Brend...

2465
来自专栏冰霜之地

高效的数据压缩编码方式 Protobuf

Protocol buffers 是一种语言中立,平台无关,可扩展的序列化数据的格式,可用于通信协议,数据存储等。

2781

扫码关注云+社区

领取腾讯云代金券