首页
社区
课程
招聘
[原创]信息安全铁人三项陕西赛区个人赛第一题WriteUp
发表于: 2018-6-17 21:35 6094

[原创]信息安全铁人三项陕西赛区个人赛第一题WriteUp

2018-6-17 21:35
6094

首先这是一道ret2dlresolve的题目,但是困难比较多;其次做这道题的前置知识我会做一个简单的介绍,更详细的内容我会在最后列一些文章以供大家参考;最后,我希望和大家分享的是我的解题思路,所以我会尽量详细的描述我碰到问题的时候如何分析定位原因并且如何去解决这个问题。

.dynamic节包含了很多有用的信息,以本题为例。

只需要关注其中的几个item,SYMTAB的值为.dynsym节的开始,PLTGOT的值为.got.plt节的开始,PLTREL指出重定位项是rela类型,JMPREL的值为.rela.plt节的开始,VERSYM对应着.gun.version节的开始。

.got和.plt的关系我就不再过多赘述,我们会用到的主要就是common plt(PLT[0]),他是跳转到_dl_runtime_resolve的核心;然后需要知道的就是GOT[0]代表.dynamic节的开始,GOT[1]的值为linkmap的首地址和GOT[2]是_dl_runtime_resolve的入口。
然后说一下_dl_runtime_resolve的大致过程。这个函数只有在某个需要被延迟绑定的函数的第一次执行时才会被调用,函数会根据.plt,.rela.plt(或者rel.plt),.dynsym以及.symstr这几个节中提供的信息来对函数的真实地址进行解析,然后将其写回.got.plt(或者.got)节中的对应位置,我用图来对这个过程做一简单说明。

注:32位和64位的rela结构和sym结构略有不同,需要按实际情况处理;
注:32位的offset是真正的offset而64位的offset是一个index

我隐藏了_dl_runtime_resolve和_dl_fixup函数的一些细节,感兴趣的可以自己去翻阅源码,不过我需要着重提一个细节。_dl_fixup函数会根据r_info>>32的值在.gun.version节查找一个值,这个是一个坑点。

代码很简单,1024字节的缓冲区但是读入了1337个字节导致了缓冲区溢出;

没有保护。
看到这里我最开始的思路是找一个jmp esp或者能跳到栈里面的跳板来执行shellcode,但是结果是没有这样的跳板存在,这时候就基本上确定是ret2dlresolve了。


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

最后于 2018-6-17 21:37 被ninebianbian编辑 ,原因:
上传的附件:
收藏
免费 1
支持
分享
最新回复 (9)
雪    币: 3567
活跃值: (467)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
2
其实你这题有点想太多了,你的第一个问题中其实就完全可以劫持程序流,用不着dl_resolve
最后于 2018-6-17 21:51 被V1NKe编辑 ,原因:
2018-6-17 21:50
0
雪    币: 328
活跃值: (39)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
VINKKe 其实你这题有点想太多了,你的第一个问题中其实就完全可以劫持程序流,用不着dl_resolve
dalao,劫持了之后用什么样的代码getshell呢?
2018-6-17 22:03
0
雪    币: 3567
活跃值: (467)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
4
ninebianbian dalao,劫持了之后用什么样的代码getshell呢?
直接可以用pwntools里的shellcarft.sh()写
2018-6-17 22:23
0
雪    币: 3567
活跃值: (467)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
5
.
最后于 2018-6-17 22:29 被V1NKe编辑 ,原因:
2018-6-17 22:24
0
雪    币: 5676
活跃值: (1303)
能力值: ( LV17,RANK:1185 )
在线值:
发帖
回帖
粉丝
6
是的
0x602000  rwxp
这块可读可写可执行,直接ROP写这里然后跳过来shellcode就好了
最后于 2018-6-18 09:42 被holing编辑 ,原因:
2018-6-18 09:40
0
雪    币: 328
活跃值: (39)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
holing 是的0x602000  rwxp这块可读可写可执行,直接ROP写这里然后跳过来shellcode就好了
我在脑力汇编的时候就已经再考虑了,既然已经能执行位置有关代码了,应该可以直接getshell了,但还是把他当ret2dlresolve做了,就当学习了吧,还是不熟悉,不太懂Linux的shellcode原理,不过还是感谢大佬
2018-6-18 10:39
0
雪    币: 5676
活跃值: (1303)
能力值: ( LV17,RANK:1185 )
在线值:
发帖
回帖
粉丝
8
ninebianbian 我在脑力汇编的时候就已经再考虑了,既然已经能执行位置有关代码了,应该可以直接getshell了,但还是把他当ret2dlresolve做了,就当学习了吧,还是不熟悉,不太懂Linux的shellcod ...
Linux  shellcode直接用中断调execve,pwntools里面有内置的
2018-6-18 11:03
0
雪    币: 3567
活跃值: (467)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
9
请问指到bss段的时候为什么要在bss基址的基础上再加上一段偏移地址呢
2018-6-26 14:04
0
雪    币: 328
活跃值: (39)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
VINKKe 请问指到bss段的时候为什么要在bss基址的基础上再加上一段偏移地址呢
emmm,你看看我问题一的前三段,然后结合代码分析一下RBP,RSP以及返回地址的关系;简单点就是因为找不到合适的构造函数参数的跳板,所以用了主函数中的代码作为跳板。
2018-6-28 09:30
0
游客
登录 | 注册 方可回帖
返回
//