girlfriend
程序中存在许多花指令,但是都是一样的类型
妨碍反编译,先去花
1 | #coding:utf-8 |
分析得出在sub_D30
函数中存在off-by-one
漏洞,程序使用realloc申请堆,并没有free函数,我们知道只要使得realloc(ptr,0)即可free(ptr),所以add函数同样具备 free功能。
sub_EA6
函数中存在printf_chk
的格式化字符串漏洞,利用%a
进行泄漏得到libc。
程序开启了沙箱,禁用execve函数,所以打free_hook,写入setcontext来实现orw。
1 | #coding:utf-8 |
pwn_c4
c4,与2020年网鼎杯boom1类似,大概就是一个小型的oj,可以直接写程序,但是能用用的语句有限,能用的比如if,int,malloc,free,printf这些。
也就是说这题本身就是任意内存读写,只需要泄漏出关键地址即可劫持程序控制流。栈上本身是保存着很多信息的,那么泄漏就从栈上入手,所以只要能使用栈上的变量即可,
- 1、通过main函数的argv
- 2、通过直接对我们的可控局部变量取地址。
1 | #coding:utf-8 |
通过测试结果,&a打印出来的是libc地址(本地结果);
拿到libc后就简单了,修改malloc_hook为system,然后malloc(“/bin/sh”);
1 | #coding:utf-8 |
T_S
同样的花指令,这题就显得高端一点;
初看整个程序没什么漏洞点,但是在edit中,利用花指令将关键代码藏了起来。
花指令类型跟girlfirend一样,这样同样用脚本整个扫一遍去花。
sub_137A函数里也有一个花指令同样隐藏了关键逻辑
只要等于1,就替换成0,可以当成一个off-by-null来用
只有一次show机会,用来泄漏heap_base,这样就可以结合off-by-null绕过新版unlink,实现堆叠,打stdout泄漏libc,再修改free_hook为system即可。
1 | #coding:utf-8 |
攻击stdout 有 1/16的概率成功,这里就不写循环了。(懒狗实锤)