常用技巧

2019年8月6日:

注意数组下标越界造成的漏洞

地址可以分批输入

system("sh")也可以执行

例题:攻防世界 pwn 高阶 stack2

 

js shell

例题:攻防世界 pwn 高阶 monkey

2019年8月9日:

ret2_runtime_resolve

大致流程:

  1. 修改 .plt 中的偏移使其指向伪造的 .rel.plt 节区中信息
  2. 设计好伪造的 .rel.plt  节区信息使其指向伪造的  .dynsym
  3. 伪造.dymsym 使其指向 .dynstr 。最后修改动态连接字符串为目标函数名

 

攻击条件:dl_resolve不会检查对应的符号是否越界,只会根据我们给定的数据来执行,dl_resolve最后的解析依赖于所给定的字符串

注意事项:把栈迁移到 .bss节区时应先检查是否可写,伪造 r_info 时注意能否被 0x10 整除

参考文章:https://wiki.x10sec.org/pwn/stackoverflow/advanced_rop/

2019年8月15日:

无 “/bin/sh” 可以去libc中找,也可以考虑向 .bss中写入(前提是 .bss 段可写)

注意 :p.send 和 p.sendline适用条件

2019年9月14日:

泄露libc函数地址的一些方法:

(一)LibcSearCher:使用前先泄露其中某个函数的地址,比如说:puts(),write()等函数的地址。例如:

from LibcSearcher import * #第二个参数,为已泄露的实际地址,或最后12位(比如:d90),int类型 obj = LibcSearcher("fgets", 0X7ff39014bd90) obj.dump("system") #system 偏移 obj.dump("str_bin_sh") #/bin/sh 偏移 obj.dump("__libc_start_main_ret")

具体安装和使用可以去github:https://github.com/lieanu/LibcSearcher

(二)DynELF:pwntools中的DynELF模块是专门针对没有libc文件时泄露地址信息,从而获取shell。其代码模板如下:

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函数的地址

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

(三)OneGadget:没用过,有兴趣的可以参考:https://github.com/david942j/one_gadget

2019年11月6日:

通过函数返回值控制eax寄存器的值

原文地址:https://www.cnblogs.com/countfatcode/p/11309247.html