-
-
[原创]信息安全铁人三项陕西赛区个人赛第一题WriteUp
-
发表于:
2018-6-17 21:35
6094
-
[原创]信息安全铁人三项陕西赛区个人赛第一题WriteUp
首先这是一道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编辑
,原因: