首页
社区
课程
招聘
[原创][基础知识]ctfpwn题修改libc库为要求的题目
发表于: 2022-2-22 16:40 19866

[原创][基础知识]ctfpwn题修改libc库为要求的题目

2022-2-22 16:40
19866

对不起buuctf,我原来一直以为你的libc库有问题,现在才发现是我太菜了不会用。你还是我心中最牛逼的网站
由于本萌新在libc库的链接上走了半年的弯路,网上相关资料不算很多,就在这分享一下相关知识以及具体操作

一些基础知识

  1. libc库是什么

    采用动态链接编译的二进制程序,必须在链接器链接运行库后才能运行
    在Linux中,常用的C语言库的运行库glibc,它的动态链接形式的版本保存在 /lib目录下,文件名叫做 libc.so
    在Linux下,动态链接器上是一个共享对象(ld.so)
    如下图,linux下elf文件main.o在ld.so的作用下与libc.so文件链接,在内存中形成可运行的程序main
    因此,想让程序运行的必要条件有:libc.so与ld.so必须为同一版本
    图片描述
  2. elf文件中与libc库相关的信息

  • “.interp”段保存着动态链接器的路径:/lib/ld-2.6.1.so
  • “.dynamic”段保存了动态链接器所需要的基本信息,比如依赖于哪些共享对象、动态链接符号表的位置、动态链接重定位表的位置、共享对象初始化代码的地址等
  • “.dynsym”段保存了与动态链接相关的符号(动态符号表),“.symtab”中往往保存了所有符号,包括“.dynsym”中的符号
  • 符号字符串表“.strtab”,对应于动态符号字符串表“.dynstr”
  • 符号哈希表“.hash” 可以加快符号的查找过程; 动态链接相关的重定位表:.rel.dyn和“.rel.plt
    因此, 工具patchelf修改链接器可以直接修改,而修改libc库是以替换的形式

libc库的修改

  1. 使用工具

    patchelf, strings, glibc-all-in-one
  2. 操作过程

    我们就以buuctf的libc-2.23.so为例
    图片描述
    下载后无法运行
    图片描述
    为什么呢,因为它还没有使用正确的链接器
    要找到正确的链接器就得知道libc版本
    这里的版本不仅仅是一个简单的2.23,还有ubuntu版本,我们可以用ida打开这个libc获取版本信息,但更简单的方法是strings搜索
    图片描述
    glibc版本为GLIBC 2.23-0ubuntu11
    接下来是glibc-all-in-one中下载获得相应链接器
    使用glibc-all-in-one前,我们必须升级他的list,这里我被狠狠坑到了,因为使用说明上update_list是二进制文件
    图片描述
    但他竟然是个python文件,就在这里我被卡了半年,不升级的list里没有2.23版本,而那些甜蜜的libc库手动下载都一言难尽
    图片描述
    注意还得是python3 update_list,只python还是寄的,终于可以cat list
    图片描述
    接着./download 2.23-0ubuntu11.3_amd64后就可以获得debug版本的glibc了
    图片描述
    接着我们修改题目libc的解释器为刚刚下载的同版本
    图片描述
    libc库可以显示正确信息了,说明解释器正确了
    现在我们可以依次更换题目文件的解释器,libc库为指定版本了
    图片描述
    更换版本正确并正确运行
    图片描述
    注意:例如本libc,题目提供的libc一般为非debug版本,不利于堆题目的调试。我们调试的绝大多数时间还是选用自己下载的debug版本,只有到例如one-gadget调试时再换为题目版本

    参考文章链接

    编译、链接过程简介https://blog.csdn.net/qq_39654127/article/details/87953661

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 0
活跃值: (273)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
NB
2022-9-28 19:36
0
游客
登录 | 注册 方可回帖
返回
//