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

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

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

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

    推荐阅读
  • 柳枝上结满柳絮(梨花淡白柳深青)

    它白衣胜雪、玉树琼苞,如清丽脱俗的美人。有“玉容寂寞泪阑干,梨花一枝春带雨”的忧伤和楚楚动人;又不乏“惆怅东栏一株雪,人生看得几清明”的旷达和通透。时过境迁,只留下梨园子弟白发新,如同拂不去的雪白梨花一样,在春雨里开成了玉容寂寞泪阑干,成了失势的帝王心里永远的遗憾和喟叹。仲春即将清明,而人生却不那么容易清明——有太多羁绊,有太多无奈,怎样才能淡泊,如何才能看开,学会适当放开。

  • 晚风什么意思(晚风歌曲的含义)

    晚风什么意思《晚风》是伍佰的歌曲,这首歌曲说的是两个曾经相爱的人又相遇了,两人都很想再回到从前,但却发现时过境迁,原来的感觉已经不在,只有又重新回到彼此各自的生活里去。而相爱的两个人,只能变成那晚风,向你道一声珍重,然后飘然而去,不再回头。

  • 普拉提和瑜伽的差别(普拉提和瑜伽有什么区别呢)

    很多人很难区别普拉提和瑜伽,因为大部分人都知道瑜伽,很多人普拉提也属于瑜伽,这个是错误的。一开始普拉提是作为运动疗法,帮助军人还有罪犯恢复身体的,后来慢慢演变为现在的帮助演员以及运动员提供运动疗法训练。可以看出普拉提和瑜伽还是有很多的不同之处的。如果你想让自己的身体线条更好,锻炼自己的肌肉,可以选择普拉提。经过了解,相信你对瑜伽和普拉提有了重新的认识,根据自己的需求选择适合自己的去练习。

  • 王者荣耀王昭君的铭文推荐(王者荣耀王昭君有什么铭文搭配)

    王者荣耀王昭君的铭文推荐铭文选择:红色梦魇+绿色献祭+蓝色轮回。这套铭文主要提供了高额的法攻和法穿,很适合王昭君这类高爆发法师使用,其次提供了少量冷却和吸血能力,可以使英雄续航能力提升。二技能是小范围控制技能,并且冰冻后王昭君的技能伤害会加倍。王昭君的大招是大范围AOE法伤,并且释放时提高高额的物理防御,但是注意大招容易被打断。

  • 苦瓜炒豆芽的怎么做(苦瓜炒豆芽怎么做好吃)

    我们一起去了解并探讨一下这个问题吧!苦瓜炒豆芽的怎么做主料:200g猪板筋、150g苦瓜、100g豆芽、适量油、适量盐、适量姜、适量酱油。豆芽去除根部长须。锅放油烧热,将猪板筋快速滑撒后装起。放入豆芽炒至软身。

  • 男孩名字这样取名最合适(男孩名字这样取名最合适有哪些)

    天玉冰凡健柏元柳涵柏昊强雅昶笑南幻珊凌青涵柳晗昱建明,接下来我们就来聊聊关于男孩名字这样取名最合适?以下内容大家不妨参考一二希望能帮到您!

  • 上海迪士尼附近还有什么好玩的地方(上海迪士尼附近好玩的地方)

    上海迪士尼附近还有什么好玩的地方杭州--西湖,现今《世界遗产名录》中少数几个和中国唯一一个湖泊类文化遗产。扬州--扬州瘦西湖,被“中国国家地理杂志”评选为江南代表园林之一。无锡--灵山大佛,太湖边气势恢宏、美轮美奂、佛教建筑群,被誉为佛教艺术的“罗浮宫”。无锡灵山大佛,2016年,一年一度的灵山浴佛节将于5月7日至31日在中国无锡灵山隆重举行。

  • 一亩地长宽各多少米(一亩地长多少米宽多少米)

    亩是面积单位,没有固定长宽。一亩=666.6666667平方米(㎡);亩是中国市制土地面积单位,一亩等于六十平方丈,大约666.67平方米。十五亩等于一公顷。选取60平方丈是因为中国古代的计数方法。现在计数大都以十为一个单位进位,古代的进位则多以“60为一个单位进位。

  • 黑木耳红枣瘦肉汤做法(怎样做黑木耳红枣瘦肉汤)

    跟着小编一起来看一看吧!黑木耳红枣瘦肉汤做法主料黑木耳30克,红枣20个,猪肉350克。调料食盐适量,姜3片,水1500毫升。黑木耳浸泡、洗净;红枣浸泡去核、洗净。先把黑木耳、红枣放置瓦煲内,加入清水1500毫升约6碗水量,煲60分钟,加入猪瘦肉和生姜,滚至熟,调入适量食盐便可。

  • iphone14性能或提升不大(iPhone14或全系6G内存网友)

    我们一起去了解并探讨一下这个问题吧!iphone14性能或提升不大当前的iPhone13系列,13/13mini配备的是4GB内存,13Pro则是6GB。最新消息称,iPhone14系列会全系提供6GBRAM,不过仅14Pro/ProMax是LPDDR5,而14/14Plus仍旧是LPDDR4X。说起来也挺合理,毕竟只有Pro会升级到A16处理器,14/14Plus仍旧是A15,即便想上LPDDR5也是有心无力。