欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

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

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

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'})

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功