封了个库

0x00 写在前面

由于如今各种ELF文件libc版本跨度比较大,采用虚拟机模式显得过于冗余,于是准备将做题环境都放到docker中。原本打算是每个版本的libc找个docker,但很幸运地发现了一个名为skysider/pwndockerdocker,该dockerlibc-2.27版本,其上除了正常的做题环境外还集成了多个libc的版本,可以用LD_PRELOAD来选择不同的libc版本,用习惯了之后还是挺方便的。就是每次要加载不同的libc时,process函数写的太长了,比较麻烦,然后以及原来写exppwntools的各种函数都时敲全名,借此机会封装了个傻逼库,以后更新博客也就都用这个库了。目前是函数的形式进行封装,等以后的功能多了可以考虑改成对象的形式进行封装。

0x01 Fish.py

from pwn import *

def get_shell(binary_name , libc_version , OSbit):
    global p , version , OS , libc , elf
    version = libc_version
    OS = OSbit

    libc_path = '/glibc/' + str(version) + '/' + str(OS) + '/lib/libc-' + str(version) + '.so'
    ld_path = '/glibc/' + str(version) + '/' + str(OS) + '/lib/ld-' + str(version) + '.so'

    if(binary_name.find(':') != -1):
        p = remote(binary_name.split(':')[1] , int(binary_name.split(':')[2]))
        binary_name = binary_name.split(':')[0]
    elif(version == 2.27):
        p = process('./' + binary_name)
    else:
        p = process([ld_path,"./"+binary_name],env={"LD_PRELOAD":libc_path})

    elf = ELF(binary_name)
    libc = ELF(libc_path)


def get_gadget():
    if(OS == 64):
        if(version == 2.19):
            gadget = [0x403ff , 0x40453 , 0xd806f]
        if(version == 2.23):
            gadget = [0x3f3d6 , 0x3f42a , 0xd5bf7]
        if(version == 2.24):
            gadget = [0x3f4b6 , 0x3f50a , 0xd6635]
        if (version == 2.27):
            gadget = [0x4f2c5 , 0x4f322 , 0x10a38c]
        if (version == 2.28):
            gadget = [0x41982 , 0x419d6 , 0xdf882]
        if (version == 2.29):
            gadget = [0xc1710 , 0xdf202 , 0xdf20e]
    else:
        if(version == 2.19):
            gadget = [0x3b056 , 0x3b058 , 0x3b05c , 0x3b063 , 0x64729 , 0x6472a , 0x123e6c , 0x123e6d]
        if(version == 2.23):
            gadget = [0x3a61c , 0x3a61e , 0x3a622 , 0x3a629 , 0x5ee65 , 0x5ee66]
        if(version == 2.24):
            gadget = [0x3a32c , 0x3a32e , 0x3a332 , 0x3a339 , 0x5f6b5 , 0x5f6b6]
        if (version == 2.27):
            gadget = [0x3d0d3 , 0x3d0d5 , 0x3d0d9 , 0x3d0e0 , 0x67a7f , 0x67a80 , 0x137e5e , 0x137e5f]
        if (version == 2.28):
            gadget = [0x3c43b , 0x3c43d , 0x3c441 , 0x3c448 , 0x65a04 , 0x65a05 , 0x12e82c , 0x12e82d]
        if (version == 2.29):
            gadget = [0x12de0c , 0x12de0d]
    for i in range(len(gadget)):
        gadget[i] += libc.address
        success('Gadget[' + str(i) + '] => ' + hex(gadget[i]))
    return gadget

def ru(text):
    return p.recvuntil(text)

def rcv(count):
    return p.recv(count)

def sl(text):
    return p.sendline(str(text))

def sd(text):
    return p.send(str(text))

def Esym(func):
    success('{0}_addr => {1}'.format(func.lstrip('_') , hex(elf.symbols[func])))
    return elf.symbols[func]

def got(func):
    success('{0}_got => {1}'.format(func , hex(elf.got[func])))
    return elf.got[func]

def plt(func):
    success('{0}_plt => {1}'.format(func , hex(elf.plt[func])))
    return elf.plt[func]

def LeakStrFormat(text):
    return u64(text.rjust(8 , '\x00'))

def LeakCharFormat(text):
    return u64(text.ljust(8 , '\x00'))

def SetELFBase(ELFBase):
    elf.address = ELFBase
    success('ELF_base => {0}'.format(hex(ELFBase)))
    return elf.address

def SetLibcBase(LibcBase):
    libc.address = LibcBase
    success('Libc_base => {0}'.format(hex(LibcBase)))
    return libc.address

def SetHeapBase(HeapBase):
    success('Heap_base => {0}'.format(hex(HeapBase)))
    return HeapBase

def sym(func):
    success('{0}_addr => {1}'.format(func.lstrip('_') , hex(libc.symbols[func])))
    return libc.symbols[func]

def binsh():
    binsh_addr = libc.search('/bin/sh\x00').next()
    success('binsh_addr => {0}'.format(hex(binsh_addr)))
    return binsh_addr

def debug():
    print pidof(p)
    raw_input()

def active():
    return p.interactive()

def close():
    return p.close()

def dbglog():
    context.log_level = 'debug'
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容