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

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

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

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表(一张线性数组)来决定。

    推荐阅读
  • 跹有几个读音都是什么(跹读音是什么)

    以下内容大家不妨参考一二希望能帮到您!跹有几个读音都是什么跹,xiān,见〖翩跹〗。翩跹,形容飞舞或行动轻快的样子。文选.左思.蜀都赋:「纡长袖而屡舞,翩跹跹以裔裔。」相关组词:蹁跹翩跹跰跹跹跹蹁跹起舞羽衣蹁跹翩跹而舞翩跹起舞婀娜蹁跹衣带翩跹。

  • 微信零钱明细怎么全部删除(微信零钱明细如何全部删除)

    跟着小编一起来看一看吧!微信零钱明细怎么全部删除首先打开微信,点击我界面的钱包。进入钱包之后,点击右上角四叶草图表。选择要删除的账单,长按住,然后点击删除即可。需要注意的是,这样删除后的零钱明细记录就无法找回了。

  • 七日瘦身汤7天瘦10斤减肥餐食谱(夏日必备减肥餐)

    食材:西兰花、白玉菇做法:1.清洗西兰花。白玉菇清洗后切小段,备用。白玉菇含有丰富的蛋白质、氨基酸、维生素、铁、锌、钙、镁等营养物质,可以促进身体的新陈代谢。

  • 美术生选什么专业就业前景好(美术生可以报考哪些专业)

    主要涉及艺术学理论类、美术学类、设计学类、戏剧与影视学类等4大类。艺术学理论类主要就是搞艺术史、理论的研究,是一个偏文科类专业,大学有很多艺术、历史、理论的课程,就业主要是去各地博物馆、艺术馆、报刊杂志、拍卖行等。

  • 浓缩汁是什么意思(浓缩汁的意思)

    浓缩汁是什么意思浓缩果汁是在原果汁的基础上去掉原水分,例如:把原果汁浓缩4倍,饮用时再加4倍水就是100%的果汁了。浓缩果汁是在水果榨成原汁后再采用低温真空浓缩的方法,蒸发掉一部分水份做成的,在配制100%果汁时须在浓缩果汁原料中还原进去果汁在浓缩过程中失去的天然水份等量的水,制成具有原水果果肉的色泽、风味和可溶性固形物含量的制品。

  • 把爱带回家何岸独自离开 何岸给元满递纸巾

    把爱带回家何岸独自离开何岸给元满递纸巾?跟着小编一起来看一看吧!把爱带回家何岸独自离开何岸给元满递纸巾把爱带回家:何岸给元满递纸巾,元满:爱太昂贵我买不起俞灏明,沈梦辰,潘时七,把爱带回家,电视剧

  • sd卡无法格式化怎优盘无法分区么办(SD卡无法格式化怎么办的解决方法)

    我们一起去了解并探讨一下这个问题吧!sd卡无法格式化怎优盘无法分区么办手机提示TF卡受损,需要格式化。把TF卡插入读卡器,接到电脑USB后,电脑提示格式化,点取消。直接使用属性中的工具-开始检查,发现无法检查磁盘错误。)等待修复完成,DOS窗口会自动关闭。修复完成后,查看一下TF卡的属性,显示正常了。把TF卡插回手机,发现一切正常了。所有资料都在,没有丢失情况

  • 并联和串联有什么区别(并联和串联区别介绍)

    并联和串联有什么区别?下面希望有你要的答案,我们一起来看看吧!并联和串联有什么区别用定义法区分:如果每个电器都是按顺序从头尾相交的话就是串联,如果是从头相交的话就是并联;用电流法区分:假如电流从电源的正极启程,并且一直都是走这条路,那么就是串联,如果电流在电路中出现了分分合合的情况,就属于并联。在冬天用电的时候如果可以的话尽量少用电热毯。因为电热毯温度太高,久而久之就会导致电路发生短路的情况。

  • 历史上梁山伯和祝英台为何不能结婚在一起(什么原因梁山伯和祝英台没有在一起)

    历史上梁山伯和祝英台为何不能结婚在一起那是在那个时代里,儿女们是没有婚姻自由的,从出生时的娃娃亲还有掌权的大人们的抢婚、逼婚,这不是一个两个有情人所能改变的。同窗三年,感情深厚,但梁山伯始终不知祝英台是女儿身。後来祝英台中断学业返回家乡。之後梁山伯在鄞当县令时,因过度郁闷而过世。

  • 凉拌兔丁的做法四川(怎么做凉拌兔丁)

    凉拌兔丁的做法四川原料:水盆兔肉500克,盐酥花生仁50克,葱25克,郫县豆瓣酱25克,豆豉5克,上等酱油25克,白糖5克,辣椒油25克,味精0.5克,花椒油0.5克,香油1.5克,熟植物油50克。分别将郫县豆瓣酱和豆豉剁碎,将郫县豆瓣酱先放入三成油温的油锅内炒至呈红、出香味时,再放入豆豉略炒,起锅晾凉,与酱油、白糖、味精、辣椒油、香油调匀成味汁。兔丁、葱丁、花生仁与味汁装在碗内拌匀,再放入花椒油拌匀后装入盘内即成。