24-07-29
本周学习总结
麻垮,这周遇到随机数仙人了。
全局常量声明:文章内容仅是由教程观点和自己总结获得,仅供参考。
一、[2023年春秋杯网络安全联赛春季赛]–three-body–你也是ETO的人?
Glibc版本:Ubuntu GLIBC 2.35-0ubuntu3
Check:

64位程序保护全开。
Ida:
漏洞点:

存在uaf漏洞。
程序本身是一道完整的堆题,只有一次show的机会和一次edit的机会,edit时的大小不能超过申请时的大小,malloc申请堆块时会随机不受控制的申请随机大小堆块,并且正常申请的堆块大小限制在0x4FF-0x1000之间,free存在uaf漏洞。
通过查找程序的伪随机数来避免申请的堆块大小不受控制,通过合理的构造unsortbin链来一次获得heap的基地址和libc的基地址。因为堆块申请大小的限制我决定采用万能的house of apple2来getshell。
只有一次的写入机会证明我们要在完成largebin attck的同时也要在栈上构造好fake_io_file。
我们可以先申请一个0x1000的chunk,然后释放它,通过构造unsortbin链的同时用合适大小的堆块将它申请回来,在完成地址的获取后仍然可以通过他们达成largebin attack和构造fake_io_file。这一步需要uaf的配合和edit的宝贵机会。
另外这里提到另外一个python函数库ctypes。因为Linux下C语言的伪随机和其相应的libc有关,而ctypes库下的cdll.LoadLibrary可以加载C的函数库到python中,通过python调用C函数的实现。
因为我的系统似乎不能调用C函数time(0)来获得随机种子,所以在python中用int(time.time())也可以达到同样的效果。
exp:
1 | |
二、[2023年春秋杯网络安全联赛春季赛]–babygame
Check:

64位程序,canary+NX开启。
Ida:
漏洞点:

存在字符串格式化漏洞。
程序主要逻辑是存在两个主要函数,函数1为闯关模式,题目为通过程序中字典随机排列的4位字符的MD5值来猜测原本的4位字符,但是程序的随机为时间假随机,可以提前通过脚本预测将要猜测的4位字符,并且由于程序运行过快的原因,一段时间内需要猜测的字符不会变化。函数2的选项4有字符串格式化漏洞。
通过闯关获得金币,金币可以用来获得字符串格式化漏洞机会。
通过字符串格式化我们可以修改atoi这个函数的got表,然后在其转换数字之前输入”sh\x00”,这样的效果等同于atoi(“sh\x00”) –> system(“sh\x00”),剩下的libc基地址什么的都可以通过字符格式化漏洞得到。
整体思路就是先大量获得金币,然后通过大量次数的字符串格式化漏洞完成攻击。
exp:
1 | |
三、[2023年春秋杯网络安全联赛春季赛]–easy_LzhiFTP
Check:

64位程序,canary+NX+PIE全开,RELRO半开。
Ida:
漏洞点1:

strncat拼接时会将内容放到存放堆块的ptr附近。
漏洞点2:

此处的edit的buf变量可以为负数,存在数组向下越界。
程序开始时需要使用用户名和密码进行登录,其中密码是通过伪随机数生成的,然后验证时是使用的strcmp函数,我们可以测试出第一个字符然后加上”\x00”来绕过密码检查。
正式进入程序后是一道完整的堆题。一开始就给了我们一次有限制的字符串格式化漏洞的机会,我们可以通过这个字符串格式化漏洞获得pie的基地址。
程序在申请堆块时可以让我们编辑堆块的名字并存放在堆块指针数组附近,我们可以将堆块命名为atoi的got表地址,程序本身调用了system,我们完全可以利用堆块指针数组向下越界编辑atoi的got表中的内容为system的plt表,然后通过atoi(“sh\x00”) –> system(“sh\x00”)来getshell。
exp:
1 | |
四、[2023年春秋杯网络安全联赛春季赛]–sigin_shellcode
Check:

mips-32-little架构,无任何保护。
Ida:
漏洞点:

达成条件后可以执行0x10长度的shellcode并直接执行。
函数1根据伪随机产生一些金币,你可以选择拿取的数量,但是拿取的数量不能超过随机产生的数量,否则程序会立刻退出。在第100次拿取时会要求你攻击魔王,50%概率直接结束程序,剩下50%要求你的攻击力达到0xABF,在完全拿取99次金币后去函数2中买一把神剑和桃木剑攻击力刚好够,金币也正好画完。
0x10的长度我们是不够输入最小的shellcode的,但是在useful_tools函数中有一段隐藏的汇编代码:

通过搜索0x6873(hs)可以找到这,这里已经将”//bin/sh\x00“放入了寄存器a0中,我们直接将a1和a2清零,然后向v0传调用号4011然后syscall就有50%的概率成功getshell。
exp:
1 | |
下周学习计划
| 应该要做的事情 |
下周该学点啥呢。
学习感受
下周该学点啥呢。