常用技巧
2019年8月6日:
注意数组下标越界造成的漏洞
地址可以分批输入
system("sh")也可以执行
例题:攻防世界 pwn 高阶 stack2
js shell
例题:攻防世界 pwn 高阶 monkey
2019年8月9日:
ret2_runtime_resolve
大致流程:
- 修改 .plt 中的偏移使其指向伪造的 .rel.plt 节区中信息
- 设计好伪造的 .rel.plt 节区信息使其指向伪造的 .dynsym
- 伪造.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寄存器的值