0x0 程序保护和流程
保护:
流程:
main()
real_main()
选择1可以新建一个note,选择2和3没有实现,选择4可以删除note,选择5可以退出程序。但是在选择1的时候没有对数组的边界进行考虑。
0x1 利用过程
1.虽然这个程序也存在UAF漏洞但是由于输出和修改功能没有实现所以能利用的角度基本没有,但是数组越界可以任意地址写。
2.可以发现相对于数组的低地址处有.got.plt表,并且.got.plt表是有读写权限的。所以可以修改.got.plt表
可以得到偏移就是函数地址减去数组地址再除以机器字长(8)
3.结合题目中的nx保护没有开启,可以将shellcode写到堆上。又因为题目没有任何方式泄露地址,所以只能通过系统调用完成需要的操作,而execve()函数是通过系统调用实现的,通过反编译libc可以查找到调用号。
因为程序的限制只能向堆上写入8个字节,但是最后一个字节被清零了。所以只能控制7个字节。
又因为堆的大小是固定的且长度不够,因此必须预留一些字节留作跳转,并且在堆上的跳转属于短跳(jmp short)。可以在程序中找到一些短跳的字节码。