在an article上介绍ROP之后,我发现作者在ROP链中放了一些文字数字。
生成外壳代码的代码片段如下:
rop += struct.pack('<L',0x10013b1c) # POP EBX # RETN
rop += struct.pack('<L',0xffffffff) # will be 0x1
rop += struct.pack('<L',0x100319d3) # INC EBX # FPATAN # RETN
rop += struct.pack('<L',0x100319d3) # INC EBX # FPATAN # RETN
#------------------------------------[dwSize (0x1) -> EBX]-#
rop += struct.pack('<L',0x10030361) # POP EAX # RETN
rop += struct.pack('<L',0x90909090) # NOP
#---------------------------------------------[NOP -> EAX]-#根据我的理解,ROP链应该由指向小工具的内存地址组成,所以CPU将按顺序在相应的内存地址执行指令。然而,作者将0xffffffff和0x90909090放在了小工具链中。
有人能解释一下这些文字数字在ROP链中的用法吗?谢谢。
发布于 2017-06-26 16:55:20
ebx成为0x1。但是,此二进制文件中的堆栈条目是4个字节,因为这是一个32位二进制文件。要完成此条目,数字应为0x00000001,但写入空字节在漏洞利用中是不好的,因为strcpy等函数将在输入达到空字节时停止处理它。因此,作者将ebx的0xffffffff值弹出(使用前两行),然后通过1增加ebx上的值。它围绕着32位系统上的最大值,值变成了第二个文字数字0x90909090,这是一个NOP-sled。0x90是NO-oPeration,它什么也不做。这可能是一个nop-sled,以满足作者试图overflow.https://stackoverflow.com/questions/19746497
复制相似问题