Pwn学习随笔( 六 )

然后打开gdb进行分析 , 可以看到调用函数puts的地址为0x80491de , 在该地址处下一个断点

Pwn学习随笔

文章插图
然后使用si进入puts函数内部
Pwn学习随笔

文章插图
可以看到在 puts@plt 中第一条指令是跳转 , 0x804c00c其实就是[_GLOBAL_OFFSET_TABLE_ + 12] , 这个地址刚好位于.got.plt表中 , 也就是说 , puts@plt 的第一步是去 .got.plt 找地址
23 .got.plt000000180804c0000804c000000030002**2CONTENTS, ALLOC, LOAD, DATA
Pwn学习随笔

文章插图
这时候我们如果再按一次si , 可以看到会直接执行到下面的那一行的指令 , 原因就是:我们之前没有调用过 puts@plt 函数 , .got.plt 里面存储的puts的地址就是下一条指令的地址而非真正的地址 , 所以按照之前说的 , 现在要触发链接器找到 puts 函数的地址了
下面的[_GLOBAL_OFFSET_TABLE_ + 4] 处的指令 , 这个地址0x804c004也是位于.got.plt节中的 , 查看该地址存储的内容
Pwn学习随笔

文章插图
其中0xf7ffd990指向ld.so的数据段 , 0xf7fe7b10指向可执行区域 , 简而言之 , 触发了链接器/加载器 , 在加载器处理之前 , 查看之前的.got.plt节中的地址0x804c00c所存储的值为
Pwn学习随笔

文章插图
而当我们单步执行 , 执行完puts函数后 , 在此查看该地址所存储的内容 , 可以看到该地址存储的内容已经发生了改变
Pwn学习随笔

文章插图
具体的流程可以看下面这张图片 , 对于符号去got表中找它的真实地址 , 如果不存在就触发链接器/加载器去更新函数的真实地址
Pwn学习随笔

文章插图

Pwn学习随笔

文章插图
在此查看0xf7e3cc30处存储的内容 , 其实就是glibc这个运行库中的puts函数的真实地址
Pwn学习随笔

文章插图
pwndbg基本操作基本指令