【PWN】学习笔记(三)【返回导向编程】(中)

目录

  • 课程
  • 回顾
  • 动态链接过程

课程

课程链接:https://www.bilibili.com/video/BV1854y1y7Ro/?vd_source=7b06bd7a9dd90c45c5c9c44d12e7b4e6
课程附件: https://pan.baidu.com/s/1vRCd4bMkqnqqY1nT2uhSYw 提取码: 5rx6

回顾

在这里插入图片描述
管道符 | 把前一个指令的输出作为后一个指令的输入,等同于数据注入
grep 的作用等同于把输入中含有后一个参数(eax)的字符串输出
在这里插入图片描述
【PWN】学习笔记(三)【返回导向编程】(中)_第1张图片
【PWN】学习笔记(三)【返回导向编程】(中)_第2张图片
【PWN】学习笔记(三)【返回导向编程】(中)_第3张图片

【PWN】学习笔记(三)【返回导向编程】(中)_第4张图片
在这里插入图片描述
值得注意的是,除了用IDA找/bin/sh的地址,还可以用pwntools中的函数来找。

动态链接过程

【PWN】学习笔记(三)【返回导向编程】(中)_第5张图片
【PWN】学习笔记(三)【返回导向编程】(中)_第6张图片
之前的ret2syscall之所以都可以找到gadget是因为静态链接,都写入了elf中
【PWN】学习笔记(三)【返回导向编程】(中)_第7张图片
【PWN】学习笔记(三)【返回导向编程】(中)_第8张图片
相同的程序动态链接和静态链接的函数数量显然不同
【PWN】学习笔记(三)【返回导向编程】(中)_第9张图片

【PWN】学习笔记(三)【返回导向编程】(中)_第10张图片
.text是代码节
foo@plt,foo是我们写的自定义函数,plt是程序中代码段中保存函数解析真实地址的节
PLT0最开始的两个指令是push 以及 jmp
.got.plt保存两个数组,其存放的位置是数据段
【PWN】学习笔记(三)【返回导向编程】(中)_第11张图片
编译这段程序之后会生成一段汇编代码,在汇编中调用一个用户函数会使用call这个指令,调用存在于动态链接库中的函数(foo)
但是这里没法直接找到foo(因为压根没有),所以会在代码段中一个特殊的位置plt节(里面也是代码),没有在动态链接库中找到的函数都会在plt中创建一个表项
【PWN】学习笔记(三)【返回导向编程】(中)_第12张图片

【PWN】学习笔记(三)【返回导向编程】(中)_第13张图片
【PWN】学习笔记(三)【返回导向编程】(中)_第14张图片
进入fool@plt表项中,首先jmp到GOT表中fool的位置。
.got.plt的作用是保存所有全局函数真实地址的表
【PWN】学习笔记(三)【返回导向编程】(中)_第15张图片
由于第一次调用GOT表还没有fool函数的真实地址,所以又返回plt中的fool;由此便知道应该去寻找fool函数的真实地址,将其填入GOT并且跳转到fool函数
【PWN】学习笔记(三)【返回导向编程】(中)_第16张图片
【PWN】学习笔记(三)【返回导向编程】(中)_第17张图片
【PWN】学习笔记(三)【返回导向编程】(中)_第18张图片
【PWN】学习笔记(三)【返回导向编程】(中)_第19张图片
【PWN】学习笔记(三)【返回导向编程】(中)_第20张图片
dl_resolve用于解析fool函数实际地址的任务
【PWN】学习笔记(三)【返回导向编程】(中)_第21张图片
解析完成后会把fool函数真实地址填入.got.plt的表项中
【PWN】学习笔记(三)【返回导向编程】(中)_第22张图片
【PWN】学习笔记(三)【返回导向编程】(中)_第23张图片
【PWN】学习笔记(三)【返回导向编程】(中)_第24张图片
【PWN】学习笔记(三)【返回导向编程】(中)_第25张图片
【PWN】学习笔记(三)【返回导向编程】(中)_第26张图片
【PWN】学习笔记(三)【返回导向编程】(中)_第27张图片
【PWN】学习笔记(三)【返回导向编程】(中)_第28张图片
【PWN】学习笔记(三)【返回导向编程】(中)_第29张图片
【PWN】学习笔记(三)【返回导向编程】(中)_第30张图片
按空格键来到汇编代码的视图
【PWN】学习笔记(三)【返回导向编程】(中)_第31张图片
向操作系统内核要了程序所需要的资源之后,首先ld.so是装载器,把这些内容装载在内存中
_start是程序的入口
【PWN】学习笔记(三)【返回导向编程】(中)_第32张图片
虚线划分了表项,每个长度是16字节
在这里插入图片描述
在这里插入图片描述
【PWN】学习笔记(三)【返回导向编程】(中)_第33张图片
在没有调用时,got中保存的是plt的值


【PWN】学习笔记(三)【返回导向编程】(中)_第34张图片
在调用一次puts函数后
plt是代码段是不会发生任何变化的,但是got中puts发生变化(填入真实地址)
在这里插入图片描述

你可能感兴趣的:(PWN,学习,笔记,CTF,PWN)