首页
社区
课程
招聘
[原创]2018redhat_gameserver 记一次较为详细的解题过程 (附原题)
发表于: 2019-11-25 11:23 10908

[原创]2018redhat_gameserver 记一次较为详细的解题过程 (附原题)

2019-11-25 11:23
10908

拿到题checksec,ida



是只开启了NX保护的。(这样的题目一般是ret2libc)





观察题目,发现第33行的地方有溢出点,通过read函数可以向s里面写nbytes个字节,同时在第21行nbytes又可以被name和occupation这个两个变量的大小所影响,因为snprintf函数是有这个漏洞的:

「snprintf的返回值是欲写入的字符串长度,而不是实际写入的字符串长度。」如:



运行结果为



10 -> 欲写入"1234567890"

实写入"1234\0" -> 5 

所以nbyte的长度取决于

"Our %s is a noble %s. He is come from north and well change out would.",name,occupation

而name,occupation的长度又取决于我们的输入。


由于s的栈空间大小为0x111,因此我们控制name,occupation的长度远超出0x111,则可实现溢出。


溢出后考虑getshell的方式。




通过调试发现,溢出一次后并不能返回main函数,因此我们只有一次构造溢出的机会,这时考虑构造rop攻击。

ROPgadget 工具查询 gadget:



这里我们选择的gadget是:pop ebp ret 和 pop esi ; pop edi ; pop ebp ; ret,利用他们来保存栈平衡。


思路:

1.构造完整payload,泄露puts_addr及修改栈中函数调用;

2.根据puts_addr,确定libc版本;

3.根据libc版本得到puts_offset,通过puts_offset、system_offset计算libc_base和system_addr;

4.传入system_addr与"/bin/sh"到修改后的栈中;

5.getshell。


根据题意,我们需要4个payload。

payload1 = 'a' * 0xff

payload2 = 'b' * 0xff

payload3 = Y

payload4 构造思路:

1.首先执行puts函数将puts的真正地址打印出来;

2.接着执行read函数将system的地址写到printf的got表中;

3.再接着执行read函数将/bin/sh参数读入bss段中;

4.最后再执行printf函数也就是相对于执行了system(/bin/sh)。


a. puts_plt

b. pop ebp ; ret       0x0804881b

c. puts_got


利用pwntools




可得puts_plt地址,ida查看也是ok的


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

最后于 2019-11-25 11:28 被guyioo编辑 ,原因:
上传的附件:
  • pwn2 (5.48kb,4次下载)
收藏
免费 2
支持
分享
最新回复 (4)
雪    币: 61
活跃值: (2390)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
2
pwn2的readme里面说的 需要提交defense和payload对抗是什么意思呢?
2019-11-25 11:52
0
雪    币: 1762
活跃值: (457)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
3
iddm pwn2的readme里面说的 需要提交defense和payload对抗是什么意思呢?
我太菜了……没有进决赛呢
2019-11-25 12:02
0
雪    币: 61
活跃值: (2390)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
4
guyioo 我太菜了……没有进决赛呢
师傅还是很强的
2019-11-25 12:48
0
雪    币: 8447
活跃值: (5041)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
5
mark
2019-11-25 12:56
0
游客
登录 | 注册 方可回帖
返回
//