首页
社区
课程
招聘
[原创] 关于不同版本glibc强行加载的方法(附上代码)
发表于: 2018-4-10 15:13 37593

[原创] 关于不同版本glibc强行加载的方法(附上代码)

2018-4-10 15:13
37593

2018/6/11 更新:https://github.com/matrix1001/welpwn 已集成

各路大佬看到这题目就知道我说的是个困扰pwn选手多年的问题,不知道大家有没有解决这个问题,反正我是强行解决了。
TODO:
1. 自行下载glibc 2.23/2.24/2.25/2.26 源码并编译
2. 将所需要使用到版本的ld.so放在pwn题目录下
3. 跑这个代码

def change_ld(binary, ld):
    """
    Force to use assigned new ld.so by changing the binary
    """
    if not os.access(ld, os.R_OK): 
        log.failure("Invalid path {} to ld".format(ld))
        return None

        
    if not isinstance(binary, ELF):
        if not os.access(binary, os.R_OK): 
            log.failure("Invalid path {} to binary".format(binary))
            return None
        binary = ELF(binary)


    for segment in binary.segments:
        if segment.header['p_type'] == 'PT_INTERP':
            size = segment.header['p_memsz']
            addr = segment.header['p_paddr']
            data = segment.data()
            if size <= len(ld):
                log.failure("Failed to change PT_INTERP from {} to {}".format(data, ld))
                return None
            binary.write(addr, ld.ljust(size, '\0'))
            if not os.access('/tmp/pwn', os.F_OK): os.mkdir('/tmp/pwn')
            path = '/tmp/pwn/{}_debug'.format(os.path.basename(binary.path))
            if os.access(path, os.F_OK): 
                os.remove(path)
                info("Removing exist file {}".format(path))
            binary.save(path)    
            os.chmod(path, 0b111000000) #rwx------
    success("PT_INTERP has changed from {} to {}. Using temp file {}".format(data, ld, path)) 
    return ELF(path)
#example
elf = change_ld('./pwn', './ld.so')
p = elf.process(env={'LD_PRELOAD':'./libc.so.6'})

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2018-6-11 11:52 被matrixIOOI编辑 ,原因:
收藏
免费 2
支持
分享
最新回复 (13)
雪    币: 699
活跃值: (444)
能力值: ( LV9,RANK:240 )
在线值:
发帖
回帖
粉丝
2
问个问题,假设我在ubuntu12.04上要运行libc2.26,这种方法能解决么?
2018-4-10 19:14
0
雪    币: 218
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3

大佬这是刚刚在trusty上面测试的,而且这个libc和ld还不是这里编译的。12.04我没有用,我觉得如果不是什么内核不兼容,应该没问题。
2018-4-10 21:16
0
雪    币: 236
活跃值: (155)
能力值: ( LV8,RANK:137 )
在线值:
发帖
回帖
粉丝
4
$  ./libc.so.6
./libc.so.6:  relocation  error:  ./libc.so.6:  symbol  _dl_starting_up,  version  GLIBC_PRIVATE  not  defined  in  file  ld-linux-x86-64.so.2  with  link  time  reference
报这个问题可以解决吗
2018-4-21 17:55
0
雪    币: 4
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
最后于 2018-5-18 17:06 被JuicyBoy编辑 ,原因:
2018-5-18 17:05
0
雪    币: 20
活跃值: (396)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
太麻烦了,
先把ld.so cp到/lib64/Ld-linux-x86-64.so.2
把程序内的/lib64/ld-linux-x86-64.so.2改为/lib64/Ld-linux-x86-64.so.2
然后设置LD_PRELOAD加载libc就可以了
2018-9-5 10:52
1
雪    币: 201
活跃值: (285)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
export LD_LIBRARY_PATH=`pwd`
export LD_PRELOAD=你的libc

最后不用了在:unset LD_PRELOAD
2018-9-18 20:56
0
雪    币: 61
活跃值: (2390)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
8
师傅也太低调了吧。。。
2019-3-24 19:54
0
雪    币: 20
活跃值: (396)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
话说我发现了更好的方法,有个工具叫patchelf,直接指定要是用的ld和libc就可以了
2019-6-22 10:53
0
雪    币: 15
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
你好,我想问下,利用这个方法加载其他版本的libc,gdb里面缺少libc debug symbols该如何解决
2019-7-15 20:22
0
雪    币: 1931
活跃值: (442)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
qazgzz 话说我发现了更好的方法,有个工具叫patchelf,直接指定要是用的ld和libc就可以了
运行那个后,程序都运行不起来了?
2019-8-26 11:42
0
雪    币: 20
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
12
Mask6asok 你好,我想问下,利用这个方法加载其他版本的libc,gdb里面缺少libc debug symbols该如何解决
你的libc没有调试符号,重新编译一个带符号的
2019-12-1 11:06
0
雪    币: 7
活跃值: (4331)
能力值: ( LV9,RANK:270 )
在线值:
发帖
回帖
粉丝
13

mark

最后于 2020-5-6 21:13 被0x2l编辑 ,原因: 修改
2020-5-1 18:29
0
雪    币: 24
活跃值: (57)
能力值: ( LV3,RANK:36 )
在线值:
发帖
回帖
粉丝
14
bree2e 你的libc没有调试符号,重新编译一个带符号的
https://github.com/matrix1001/glibc-all-in-one下载对应版本的lib
指定加载的方式:
pwn_file="./2.23-0ubuntu10_amd64/ld-2.23.so --library-path ./2.23-0ubuntu10_amd64/ ./SleepyHolder"
p = process(pwn_file.split())
2020-6-4 18:16
0
游客
登录 | 注册 方可回帖
返回
//