首页
社区
课程
招聘
[原创]2017 湖湘杯Pwn100 栈溢出绕过canary
发表于: 2018-2-12 23:44 16286

[原创]2017 湖湘杯Pwn100 栈溢出绕过canary

2018-2-12 23:44
16286

https://github.com/eternalsakura/ctf_pwn/tree/master/湖湘杯2017/pwn100h

先随手输入测试一下
图片描述
从结果来看很像栈溢出了。

打开IDA查看代码
图片描述
找到main函数,跟进sub_8048B29()

图片描述
图片描述
跟进去找到输入点,可以看到最大可以输入512字节的数据,对于输入格式的要求是能够进行base64解码。

图片描述
根据我圈起来的地方基本上可以很明显的看出这是base64解密

如果对base64还有不懂,可以参考base64 c语言实现维基百科

base64解码的结果存入char数组v21[257],base64解码之后的数据大小大概是原来的3/4,足够造成栈溢出了。
图片描述
漏洞函数地址为0x080487E6

图片描述

wait(0)函数的作用是等待任意一个子进程退出。
http://www.cnblogs.com/linux-sir/archive/2012/01/27/2330014.html

图片描述

一般的思路是先leak出canary的cookie,然后在payload里,把原来的canary位置的cookie用我们leak出的正确的cookie写入,之后就是正常的rop。
不过这题,emmm,有个fork呀……参考这篇文章http://0x48.pw/2017/03/14/0x2d/,直接爆破canary
这是个32位的程序,所以canary有4个字节,最低位一定是\x00,所以只需要爆破三个字节即可。
构造爆破payload格式为:padding+canary+chr(i)
(canary的玩法不要太多,可以参考这篇文章:http://veritas501.space/2017/04/28/论canary的几种玩法/

先找到padding的大小
图片描述
再看看canary在哪,在数组旁边。
图片描述
图片描述
所以我们的padding大小就是257字节了。
再重复一遍,对fork而言,作用相当于自我复制,每一次复制出来的程序,内存布局都是一样的,当然canary值也一样。 那我们就可以逐位爆破,如果程序GG了就说明这一位不对,如果程序正常就可以接着跑下一位,直到跑出正确的canary。

爆破函数

关于构造rop可以参考蒸米的文章:https://yq.aliyun.com/articles/58699
图片描述


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2019-1-28 15:02 被admin编辑 ,原因:
收藏
免费 1
支持
分享
最新回复 (3)
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
谢了,思路很清晰
2018-2-13 09:46
0
雪    币: 1218
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
学习到了,谢谢
2018-4-27 20:54
0
雪    币: 38
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
此题泄漏canary可以直接用printf泄漏,方便调试!
2019-1-16 17:26
1
游客
登录 | 注册 方可回帖
返回
//