3.pwn入门新手做无system泄露libc.so版本攻防世界pwn100 pwn200(dynelf 、libsearcher与got表plt表解)

本文介绍了如何在没有system符号的环境中,利用DynELF和Libsearcher技术进行信息泄露,以获取目标程序的system函数地址。文章详细讲解了write和puts函数在信息泄露中的应用,以及在32位和64位环境下的利用技巧,并给出了pwn200和pwn100题目的解决方案。
摘要由CSDN通过智能技术生成

上来先贴一个got表与plt表大佬写的got表与plt表详解
查找函数地址的典型方法是从泄漏的同一个库中的另一个函数的地址计算到所需函数的偏移量,然而,要使这种方法有效地工作,gLibc的远程服务器版本需要与我们的相同。我们还可以通过泄漏一些函数并在libcdb.com中搜索找到gLibc的远程版本,但有时这种方法会失败

dynelf 其基本代码模板如下:

p = process('./xxx')
def leak(address):
  #各种预处理
  payload = "xxxxxxxx" + address + "xxxxxxxx"
  p.send(payload)
  #各种处理
  data = p.recv(4) )#接受的字节要看程序是32位还是64位来决定 ,32位接受4个字节的数据 而64位接受8个字节的数据
  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函数的地址

需要使用者进行的工作主要集中在leak函数的具体实现上,上面的代码只是个模板。其中,address就是leak函数要泄漏信息的所在地址,而payload就是触发目标程序泄漏address处信息的攻击代码。

使用条件

不管有没有libc文件,要想获得目标系统的system函数地址,首先都要求目标二进制程序中存在一个能够泄漏目标系统内存中libc空间内信息的漏洞。同时,由于我们是在对方内存中不断搜索地址信息,故我们需要这样的信息泄露漏洞能够被反复调用。以下是大致归纳的主要使用条件:

1)目标程序存在可以泄露libc空间信息的漏洞,如read@got就指向libc地址空间内;

2)目标程序中存在的信息泄露漏洞能够反复触发,从而可以不断泄露libc地址空间内的信息。

当然,以上仅仅是实现利用的基本条件,不同的目标程序和运行环境都会有一些坑需要绕过
。接下来,我们主要针对write和puts这两个普遍用来泄漏信息的函数在实际配合DynELF工作时可能遇到的问题,给出相应的解决方法。

write()

write函数的特点在于其输出完全由其参数size决定,只要目标地址可读,size填多少就输出多少,不会受到诸如‘\0’, ‘\n’之类的字符影响;而puts, printf函数会受到诸如‘\0’, ‘\n’之类的字符影响,在对数据的读取和处理有一定的难度
缺点是需要传递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:000000

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值