百摩网
当前位置: 首页 生活百科

linux渗透测试从入门到精通(黑客基础知识-linux-plt篇)

时间:2023-07-08 作者: 小编 阅读量: 4 栏目名: 生活百科

PLT是一种Linux实现的延迟加载技术,据我了解windows不带这个技能,windows是程序启动的时候进行符号重定向的。从上图,我们可以了解到字符串"Helloworld"最终是由main函数调用puts函数来打印的。但是实际从汇编来看,main函数并没有直接去callputs函数,而是调用的puts@plt。请注意puts@plt并不是puts函数,这里不要搞混了,它只是一个跳板函数。

本文来自我我的chinaunix:http://blog.chinaunix.net/uid-69947851-id-5825797.html

从《Linux应用程序elf描述》我们讲到了PLT,但并没有深入理解,因此本篇主要介绍PLT是怎么工作的。

那么什么是PLT?PLT是一种Linux实现的延迟加载技术,据我了解windows不带这个技能,windows是程序启动的时候进行符号重定向的。而符号重定向是指可执行程序在编译的时候,不能提前知道对应函数、全局变量符号的具体地址,这个地址通常位于动态库当中。因此,需要在加载动态库之后,才能知道它的具体地址。故而,编译器在编译的时候,通常只留一个占位符给对应地址,这需要在应用程序启动的时候,由动态解释器对这种没有具体地址的符号进行新地址填写和查找的过程 叫做符号重定位。既然有了符号重定向,PLT拿来又有什么用? 当我们在启动一个拥有几千上万动态库的应用程序的时候,如果所有函数符号都要在启动的时候去重定位它的实际地址,那么这需要多长时间呢?因此,Linux为了节约程序的启动耗时,采用了PLT技术,所谓PLT技术就是指所有的函数的地址重定位不是在启动的时候完成, 而是在具体函数调用的时候完成,这样启动时间就大大加快了。

我们以hello world程序为例,如下:

点击(此处)折叠或打开

执行:gcc -g hello.c -o hello 生成hello可执行文件(可以GDB调试的ELF文件格式).

咋们先看看这个hello程序的代码段部分和.plt段部分,如下:

如上图,我们注意带颜色部分,通过hello.c,我们可以看出,我们实际是在main函数当中调用了printf函数,然后main函数返回。但是通过汇编代码,我们看到在main函数当中,并没有printf函数,这是为什么呢?因为我们的printf函数只传入了字符串,这个写法默认会被编译器优化,优化成有puts函数代替printf来打印字符串,如果有其他可变参数传入,则会直接用printf,而不会被优化(有兴趣的可以自己试试)。

从上图,我们可以了解到字符串"Hello world"最终是由main函数调用puts函数来打印的。但是实际从汇编来看,main函数并没有直接去call puts函数,而是调用的puts@plt。请注意puts@plt并不是puts函数,这里不要搞混了,它只是一个跳板函数。我们知道puts函数的具体实现是在libc.so当中,因此这里引入的puts@plt函数,实际就是我们的PLT技术(程序刚开始运行的时候,由于启动并没有对puts函数的地址进行重定位,因此不能直接去call puts函数,而必须要经过跳板函数puts@plt去转换一下)。

如上图29行,main函数调用puts@plt函数,而puts@plt函数在第8行实现,它也是一个函数,只是的实体在.plt段当中,它的作用就是帮助我们的hello程序去定位真正的puts函数。下面我们来详细解说这个puts@plt的运行过程:

如上图,_GLOBAL_OFFSET_TABLE_实际上就是PLT GOT表的基地址即.got.plt段的地址0x601000,我们通过objdump -s hello 可以获取到,下面是.got.plt段的部分数据:

注意:RIP指针始终指向下一条指令

我们看到puts@plt的第一行汇编,jmpq *0x601018(0x601018 = %rip 0x200c12 = 0x4003f60x200c12),而0x601018这个地址是属于.got.plt段的,.got.plt段中红色部分就是0x601018的数据部分,即0x400406(注意大小端),这个地址就是puts@plt的第二行汇编,也就是main函数跳转到puts@plt函数运行,然后puts@plt间接跳转到0x400406也就是pushq $0x0(黄色标记部分),最后通过jmpq 0x4003f0跳转到0x4003f0(黄色标记部分)去运行,并执行0x601010上的数据。我们用gdb实际看看运行效果:

点击(此处)折叠或打开

从上图可以看到,当以后再次想调用puts函数的时候, 就不需要再次经过这些步骤了,因为地址0x601018不在记录它的下一行汇编代码,而是变成了真正的puts函数地址,一个偷梁换柱就这样完成了。

_dl_runtime_resolve函数这里不做详细说明, 有兴趣的可以去C库查找对应实现,这个函数的功能就是去重定位对应C库中的函数的真实虚拟地址的,最后做一些操作,覆盖对应.got.plt的数据,然后返回。整个执行流程大概如下:

注:以上调用,中间采用GOT表(一张线性数组)来决定。

    推荐阅读
  • 广西特产水果(关于广西特产水果)

    广西特产水果龙眼桂圆又称桂圆,具有很好的滋补补益作用,可用于心脾两虚、气血不足引起的失眠、健忘、惊悸、头晕等症。荔枝“红尘中骑公主谈笑风生,无人不知是荔枝”,形容广西的荔枝。荣县沙田柚是最好的柚,有“柚中之王”的美誉。恭城月氏恭城月氏是广西的特产,是中国民族地理学的标志性产品。其肉质脆嫩,香甜可口,富含人体所需的高蛋白和维生素,微量元素、钙、铁含量高,营养丰富全面,对治疗胃病、降血压有明显疗效。

  • 鸿运当头叶子发黄焦边干枯怎么补救(鸿运当头叶子焦了怎么办)

    鸿运当头叶片发黄干枯首先将发黄干枯的叶片剪掉,然后检查植株根系是否腐烂,若根系腐烂,则需将腐烂根系剪掉并消毒,然后更换盆土,将其养护在通风、阴凉处。鸿运当头的生长习性温度:鸿运当头喜欢温暖湿润的环境,最适宜的生长温度为21~28℃,当外界温度过高或过低的时候,需做好防护措施。

  • 不成器年幼的她成了薛姨妈(年少不懂薛姨妈)

    薛姨妈正要同居一处,方可拘紧些儿子,若另住在外,又恐他纵性惹祸,遂忙道谢应允。从此后薛家母子就在梨香院住了。对于这个举措薛姨妈是举双手赞成,她使劲的说了袭人的很多好话。为了避免这样的事情发生,薛姨妈自然要先下手为强。薛姨妈做得最伤人的一件事就是认了黛玉做女儿,而且还欺骗黛玉会为她的婚事做主。薛姨妈出身王家,又独立支撑薛家多年,她的心智早已不是当初那个懵懂无知、单纯善良的女子了。

  • 景德镇是哪个省(景德镇介绍)

    景德镇是哪个省景德镇是江西省下辖设区的市,景德镇市位于江西东北部,土地面积5256平方公里,紧邻安徽省。景德镇市是世界瓷都,中国直升机工业的摇篮。国务院首批公布的24座历史文化名城之一和国家甲类对外开放地区。2018年,景德镇市常住人口167.3213万人。2019年,景德镇市下辖2个市辖区、1个县级市、1个县,实现地区生产总值926.11亿元,比上年增长7.8%,增速位居全省第七。

  • 杀戒剧情介绍(杀戒剧情简介)

    因为一个突发状况,肖立昆与江月娥闪婚成为夫妻,并生下儿子肖磊。婚后夫妻之间出现了无法弥补的感情裂痕,肖立坤对于娇妻婚后的种种行为疑心重重,而江月娥亦有重大婚前隐情瞒着肖立昆。在确认江月娥出轨后,两人毅然决定离婚,但江月娥不放心儿子继续跟肖立昆在一起,誓死争夺抚养权,肖立昆也毫不让步,决心守住自己的孩子。精神重创之下,肖立昆回老家取出祖传的杀猪刀。

  • linux由什么组成(什么是Linux)

    linux由什么组成和Windows操作系统软件一样,Linux也是一个操作系统软件。其在设计之初,就是基于Intelx86系列CPU架构的计算机的。它是一个基于POSIX的多用户、多任务并且支持多线程和多CPU的操作系统。Linux是由世界各地成千上万的程序员设计和开发实现的。在过去的20年里,Linux系统主要应用于服务器端、嵌入式开发和个人PC桌面三大领域,其中服务器端领域是重中之重。可自由传播,无任何商业化版权制约。

  • 朝鲜语和韩语一样吗(二者本质相同)

    广义上,“朝鲜语”与“韩语”并无区别,是同一种语言;狭义上,“朝鲜语”指朝鲜官方语言,“韩国语”指韩国的官方语言。中国官方定义其正式名称为“朝鲜语”而非“韩国语”或“韩语”,如中国最著名的北京外国语大学,其课程专业名称即为“朝鲜语”。

  • 2022上半年信阳平桥区中小学教资认定机构

    (二)驻平桥部队现役军人和现役武警。申请认定教师资格的学历及其他条件、程序要求与内地(大陆)申请人相同。

  • 达坂山是什么地方 达坂山是什么地方气温

    达坂山地处青海省大通与门源两县的交界处,是青海通往甘肃的交通要道。在青海高原的众多的山峦中,达坂山只能算小字辈,但其特殊的地理位置,使达坂山在高原声名显赫。达坂山南北两侧的河谷地区海拔高度相对。

  • 生物高中知识点总结(生物学中的几个)

    控制红色色盲和绿色色盲的是2个非等位的隐性基因,这两个基因均位于X染色体上。着丝点与纺锤丝连接,与染色体的移动密切相关。着丝粒的分裂相当于基因的程序性表达,与纺锤丝无关。用秋水仙素处理萌发的种子或幼苗时,着丝粒正常分裂,纺锤体却不能正常形成,因此,细胞中染色体数目加倍。在减数分裂形成配子过程中同源染色体彼此分离,因此卵细胞中无同源染色体,卵细胞中的这10条染色体不能称5对。