PWN
eval
漏洞点
对数组模拟栈的那个栈顶没做下溢校验,先输入符号可以构成溢出点
+200/2+(target_offset - 100)
这样输入即可将栈顶迁移到任意位置
难点
需要逆向整个模拟栈的结构
可以配合动态调试得出模拟栈结构
addr+0 0
addr+1 符号位
addr+2 0
addr+3 栈顶偏移
addr+4 第一个数
addr+5 第二个数
通过处理符号进行运算的时候,会导致addr+3 -= 1,将原本应该填在addr+4的数填在了addr+3即可完全控制offset,进而控制任意位置读写
heap
漏洞点
对小堆块(≤0x80)大小的堆块管理有问题,没有进行pre位置(+0x18)的有效校验,进而可以控制任意位置读写,但要注意会写入0x28的头部
远程FLAG加载进了环境变量位置,通过泄露_IO_2_1_stdout_(bss区)获得libcv版本,再申请libc中__environ处,判断是否能泄露出0x7fffxxxxxx的值判断合适的libc版本,最后申请到存储环境变量字符串处的内存,然后多次尝试泄露出FLAG环境变量的值即可。(RIP挟持不了,栈内距离小于0x28,申请会覆盖上个返回地址,导致Segment fault)
难点
需要逆向整个他自己写的malloc和free函数以及堆块结构,比较复杂,逆了老半天,感觉在看源码
标签:p64,FILE,wp,柏鹭杯,add,IO,fake,pwn,addr From: https://www.cnblogs.com/hkbin/p/17759254.html