basic usage of libc
本文最后更新于:2022年3月22日 晚上
libc的基本用法
题目来源:XCTF-PWN-新手区-level3
0下
0x1 基本分析
32-bit elf文件
NX保护开启
32位IDA下,仅有一个read溢出点
栈溢出方式获取system权限
0x2 找到突破口
没有任何后门函数,没有调用system函数
但是题目给出了libc_32.so.6文件
思路如下:
利用题目中调用的write函数,打印自身got表地址,通过write函数与libc基址的offset值,获得libc基址,从而调用libc中的内容(libc中既有system函数又有/bin/sh字符串)
构建exp脚本如下:
- 完成136大小的buf字符串数组溢出和32位下saved_register ebp的溢出
- 用write函数地址覆盖返回地址,以调用write函数。
- 布置栈帧,此处覆盖意义为,write函数的返回地址,覆盖为main函数地址,准备第二次溢出。
- 布置栈帧,write函数的参数。(通过此处获取got地址)
\
第二次溢出,覆盖后调用system(“/bin/sh”)
完成本题。
0x03总结
- 用elf = ELF(“./file”)的形式调用文件内,自有的函数的plt、got地址。
- 32位的题,用布置栈帧方法。
- 打印出来的got地址,用u32方法解码后,是该函数在libc中的真实地址。
- 用libc.symbols[“func”]的方法获取函数func相对基址的offset。
- 二次溢出,达到一次拿地址,二次打通的效果。
- 教科书式的题值得多次揣摩!
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!