首页
社区
课程
招聘
[原创]攻防世界pwn高手进阶区pwn1
发表于: 2019-9-9 22:55 18513

[原创]攻防世界pwn高手进阶区pwn1

2019-9-9 22:55
18513


64位程序,动态链接,然后保护开的差不多了

程序无system(),无"/bin/sh",但是程序有libc(有libc表示有获得shell的函数),这就比较好办了,
在libc中找以一下shell的地址

继续,分析main()

v8就是那个标志canary,程序有个输出puts(),有read(),并且read()有一个非常明显的溢出(s的大小只有0x90,但是read读取了0x100大小的数据)

然后程序要求输入1/2/3进行选择下一步的操作

​ 需要利用puts()泄露出标志canary,标志canary在rbp的上面,也就是在s的底部,所以当我们输入0x88个字节 的时候,puts()就能够将标志canary输入出来

​ 上图为输入0x88个a之后的堆栈情况其中0x00007FFFF8B292A8处标志canary(这个不是真正的canary,下面会说明),0x00007FFFF8B292ABB为返回地址,继续运行程序能够得到标志canary
图片描述
需要注意的是:canary的真实值应该是0x502CB52AB5572700,而不是0x502CB52AB557270A,这是因为在我们输入0x88个'a'时还输入了一个回车,这个回车将标志canary尾部的'\x00'覆盖为'\x0A'。另外正是因为这个回车覆盖掉'\x00',才使得puts()能够输出标志canary,不然的话puts()在遇到'\0‘时就停止输出了

所以我们可以用以下这段代码获得标志canary

​ 在获得到标志canary之后,我们可以再次利用puts()泄露出put()的真实地址,这是为了应对ASLR

​ 由于是64位程序,所以需要一个gadget,这个可以直接找到

调用我们找到的execve("/bin/sh")


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

收藏
免费 3
支持
分享
最新回复 (6)
雪    币: 334
活跃值: (944)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
下次留下bin文件吧
2019-9-10 11:15
0
雪    币: 1219
活跃值: (187)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
好的
2019-9-10 18:52
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
贴主您好!小生有一处不是太明白,还请贴主帮忙解答一下,就是在构建泄露的payload时,为什么got表在前,plt表在后。在泄露时不是应该先plt在got的吗?
2019-11-4 16:02
0
雪    币: 163
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
请问大佬,为什么输入0x88个a之后按回车,是将标志canary尾部的'\x00'覆盖为'\x0A',而不是讲canary本身存储的内容给覆盖呢?是因为小端存储嘛?
2020-3-14 14:53
0
雪    币: 620
活跃值: (372)
能力值: (RANK:150 )
在线值:
发帖
回帖
粉丝
6
wx_刘太阳 请问大佬,为什么输入0x88个a之后按回车,是将标志canary尾部的'\x00'覆盖为'\x0A',而不是讲canary本身存储的内容给覆盖呢?是因为小端存储嘛?
0xA 是换行符
2020-3-15 13:39
0
雪    币: 38
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
胤殇离 贴主您好!小生有一处不是太明白,还请贴主帮忙解答一下,就是在构建泄露的payload时,为什么got表在前,plt表在后。在泄露时不是应该先plt在got的吗?
这是64位程序,使用pop rdi把got弹到rdi中作为参数,非32位直接压栈
2020-11-18 16:28
0
游客
登录 | 注册 方可回帖
返回
//