然后打开gdb
进行分析 , 可以看到调用函数puts
的地址为0x80491de
, 在该地址处下一个断点
文章插图
然后使用
si
进入puts
函数内部文章插图
可以看到在 puts@plt 中第一条指令是跳转 ,
0x804c00c
其实就是[_GLOBAL_OFFSET_TABLE_ + 12] , 这个地址刚好位于.got.plt
表中 , 也就是说 , puts@plt 的第一步是去 .got.plt 找地址 23 .got.plt000000180804c0000804c000000030002**2CONTENTS, ALLOC, LOAD, DATA
文章插图
这时候我们如果再按一次
si
, 可以看到会直接执行到下面的那一行的指令 , 原因就是:我们之前没有调用过 puts@plt 函数 , .got.plt 里面存储的puts
的地址就是下一条指令的地址而非真正的地址 , 所以按照之前说的 , 现在要触发链接器找到 puts 函数的地址了下面的[_GLOBAL_OFFSET_TABLE_ + 4] 处的指令 , 这个地址
0x804c004
也是位于.got.plt
节中的 , 查看该地址存储的内容文章插图
其中
0xf7ffd990
指向ld.so
的数据段 , 0xf7fe7b10
指向可执行区域 , 简而言之 , 触发了链接器/加载器 , 在加载器处理之前 , 查看之前的.got.plt
节中的地址0x804c00c
所存储的值为文章插图
而当我们单步执行 , 执行完
puts
函数后 , 在此查看该地址所存储的内容 , 可以看到该地址存储的内容已经发生了改变文章插图
具体的流程可以看下面这张图片 , 对于符号去
got
表中找它的真实地址 , 如果不存在就触发链接器/加载器去更新函数的真实地址文章插图
文章插图
在此查看
0xf7e3cc30
处存储的内容 , 其实就是glibc
这个运行库中的puts
函数的真实地址文章插图
pwndbg基本操作基本指令
help
//帮助- i//info , 查看一些信息 , 只输入info可以看可以接什么参数 , 下面几个比较常用
i b
//常用 , info break 查看所有断点信息(编号、断点位置)i r
//常用 , info registers 查看各个寄存器当前的值i f
//info function 查看所有函数名 , 需保留符号
- show//和info类似 , 但是查看调试器的基本信息 , 如:
show args
//查看参数
rdi
//常用 , +寄存器名代表一个寄存器内的值 , 用在地址上直接相当与一个十六进制变量backtrace
//查看调用栈q
//quit 退出 , 常用vmmap
//内存分配情况经验总结扩展阅读
- 四十一 增删查改分页 Java开发学习----MyBatisPlus标准数据层开发
- 中 学习ASP.NET Core Blazor编程系列十——路由
- CC1,3,6回顾
- 图学习【参考资料2】-知识补充与node2vec代码注解
- 二十四 设计模式学习:Spring 中使用到的设计模式
- Java安全之CC3
- TensorFlow深度学习!构建神经网络预测股票价格!?
- JUC学习笔记——共享模型之管程
- Seata Server 1.5.2 源码学习
- 2022极端高温!机器学习如何预测森林火灾?? 万物AI