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脚本如下:
exp脚本

  1. 完成136大小的buf字符串数组溢出和32位下saved_register ebp的溢出
  2. 用write函数地址覆盖返回地址,以调用write函数。
  3. 布置栈帧,此处覆盖意义为,write函数的返回地址,覆盖为main函数地址,准备第二次溢出。
  4. 布置栈帧,write函数的参数。(通过此处获取got地址)


\

第二次溢出,覆盖后调用system(“/bin/sh”)
完成本题。

0x03总结

  1. 用elf = ELF(“./file”)的形式调用文件内,自有的函数的plt、got地址。
  2. 32位的题,用布置栈帧方法。
  3. 打印出来的got地址,用u32方法解码后,是该函数在libc中的真实地址。
  4. 用libc.symbols[“func”]的方法获取函数func相对基址的offset。
  5. 二次溢出,达到一次拿地址,二次打通的效果。
  6. 教科书式的题值得多次揣摩!

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!