2020年大学生信息安全竞赛华北赛区半决赛部分pwn题
前言
比赛的第一天在钓鱼,题目基本都是胡哥做的修的,挑两个印象比较深的记一下。
Day1-sentencebox
程序逻辑 && 漏洞利用
菜单题,new/edit/show/delete,其中delete有UAF,输入有check,只能部分字符可以输入,但是注意是先read再做检测,因此我们有一次输入非法字符的机会,之后就exit了,这题当时做的时候想了两种方法,一种是exit退出时候调用的那个函数指针,不过看了下爆破的次数需要的比较多,因此主要做了第二种思路,就是glibc 2.27下的IO_FILE利用。今天看了下东秦的师傅是第一种思路做的,可以参考neuqcsa。这里利用ub留下的libc地址,部分写低两个字节到_IO_list_all,改其值为_IO_list_all+8,而后布置fake_io,io的关键check是_flags & 1 != 0以及 _IO_USER_BUF != 0,构造的话,fp+0xe8为system函数地址,fp+0x38为binsh字符串地址,fp+0xd8 = _IO_str_jumps-8。
另外stdout不能改,否则puts会出问题,stderr不能改,因为其fp+0xe8对应到stdout->read_ptr,在puts的时候会被更新,stdin也无法改,因为两个字节改不到
1 | __int64 __fastcall Check(_BYTE *a1, int a2) |
exp.py
概率大概1/16。
1 | #coding=utf-8 |
Day2-calculator
程序逻辑 && 漏洞利用
这题是新华三杯的原题pwn2,程序的开始有个隐蔽的溢出,输入sz=0即可溢出写ptr,利用sscanf可以修改got表,这里改free@got=printf@plt泄露libc,atoi@got改为system,在输入size时get shell。
1 | signed __int64 main_func() |
exp.py
1 | #coding=utf-8 |
fix
溢出类型的洞直接IDA patch改小size,UAF的洞比较难patch,需要编写hook.c,在eh_frame写入修改代码,手动清空chunk_list[idx],具体可以看p4nda师傅的博客CTF线下赛中常用的PWN题patch方法