首页
社区
课程
招聘
[原创]XCTF攻防世界 level3
发表于: 2019-10-3 12:52 18945

[原创]XCTF攻防世界 level3

2019-10-3 12:52
18945

首先,检查一下程序基本信息:

程序很简单,保护开的也差不多。但是需要注意,这道题单独给出了libc,而且根据题目提示,程序中没有现成的system函数。这就需要我们从libc中动态加载system函数。
初步思路:PIE没有开启,那么在libc中函数的offset就是固定的,只要确认了libc的base address,然后计算出system函数的offset,就可以定位到system函数的真实地址,实现调用。

strings查看一下是否有明显的字符串信息:

从字符串信息来看,没有明显的可以利用的字符串,函数也只有write和read,在某些情况下这两个函数可以构造溢出,先留心一下。

main函数:

没有明显的问题,直接进入vulnerable_function()

vulnerable_function函数:

有一个缓冲区buf,在read函数中进行了调用。可以进行溢出。

libc中的函数的相对地址是固定的,要想获取到system函数的地址,可以通过write()函数进行offset计算。

在vulnerable_function()中,先调用了write()函数,然后调用read()函数。write()函数返回到vulnerable_function()后,再进行read()函数调用,这样我们就可以进行二次攻击。

两次攻击stack中的情况

这样的话,第一次使用的payload构成如下:

payload = 'A'*0x88 + p32(0xdeadbeef) + p32(write_plt) + p32(main_addr) + p32(1) + p32(write_got) + p32(0xdeadbeef)

利用第一次攻击,就可以获取到libc的基地址。然后进行第二次攻击,使用的payload构成为:

payload0 = 'A'*0x88 + p32(0xdeadbeef) + p32(sys_addr) + p32(0xdeadbeef) + p32(bin_sh_addr)

中间涉及到几个地址的计算,各地址的计算方式如下:

这样的两次攻击下来,就可以使用libc中的system函数进行"/bin/sh"的调用,从而getshell。

执行完成后,可以成功拿到flag:


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

收藏
免费 5
支持
分享
最新回复 (6)
雪    币: 3935
活跃值: (192)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
消灭0回复~
大佬搞溢出厉害~~
最后于 2019-10-3 13:20 被nqxcwl编辑 ,原因:
2019-10-3 13:20
0
雪    币: 26245
活跃值: (63297)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
3
感谢分享!
2019-10-3 17:52
0
雪    币: 612
活跃值: (126)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
PIE没有开启,那么在libc中函数的offset就是固定的
我记得好像开了PIE,偏移也是固定的
2019-10-23 16:33
0
雪    币: 2081
活跃值: (541)
能力值: ( LV3,RANK:27 )
在线值:
发帖
回帖
粉丝
5
为了学习pwn跟着楼主的每一篇学过来的!!!必须点赞!!!
2020-4-3 11:24
0
雪    币: 20
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
师傅您好,请问payload 中为什么需要加p32(0) p32(0xdeadbeaf)才会执行成功呢?
2021-6-8 23:16
0
雪    币: 15187
活跃值: (16852)
能力值: (RANK:730 )
在线值:
发帖
回帖
粉丝
7
blizzard0205 师傅您好,请问payload 中为什么需要加p32(0) p32(0xdeadbeaf)才会执行成功呢?
返回地址和buffer之间是有个寄存器的地址的,你动态调试一下看看就明白了。然后就是看一下汇编,有个寄存器入栈的操作
2021-6-9 09:03
0
游客
登录 | 注册 方可回帖
返回
//