0x01程序分析
首先查看main函数,比较简单,调用了alarm和sub_80483B,进入sub_80483B看看。
sub_80483B的作用是读取0x40个字节到ebp-40处,这里显然存在栈溢出漏洞。
发现只开了一个栈不可执行,于是想构造rop链。但是整个文件搜索下来也没有发现什么有价值的gadget。
0x02 return to dl-resolve知识学习
玩过pwn的赛棍都知道,pwn题一般都会提供一个libc文件用于泄露函数的地址,在这里介绍一个不依赖于libc的方法。
这里还是以我们的0ctf2018 babystack为例进行讲解。
我们知道,在ELF文件中,库函数的调用都是延迟绑定的,例如当第一次执行printf时,首先是将printf的地址解析出来填到printf的got表项中,第二次运行时,直接根据printf的got表里面的地址调用相应函数,称为延迟绑定。
查看ELF文件.dynamic section里面的运行时函数解析地址:
其中JMPREL保存的是.rel.plt 表的入口地址,该表用于运行时函数重定位。
来看一下.rel.plt表中的内容。PLTRELSZ是.rel.plt表的大小为24字节,RELENT为每个.rel.plt表项的大小为8字节,所以.rel.plt中有3个表项。
这些表项为ELF32_Rel类型的数据结构。其中r_of