dubblesort
能从这道题学到的小技巧还是很多的。
首先是一种leak栈信息的办法,read没有在读入数据之后做处理,所以可以让字符串不以‘\x00’结尾,之后用”%s”打印的时候就可以打印出栈上的信息。
经过动态调试可以发现,栈上有一个libc的地址,打印出来之后就可以算出system和/bin/sh的地址。当然还要注意一点是这个程序是会将栈上的数值进行排序,所以注意一样输入数值的大小顺序即可。
exp想了想还是不留了。
hacknote
这道题看起来是一道很简单的uaf,然而做着做着发现了问题,这个程序里面用来打印note的函数有点奇怪:
note[i]->printer(note[i])
而这个printer里面大概是:
puts(¬e[i]+4)
对,没错,没有办法直接方便的复写这个printer的地址为system。
之后我卡了很久,第一步肯定非常简单,直接覆盖buffer的地址为got表上的地址,这样就可以通过leak的函数地址算出system的地址。
最后快要绝望的时候,我看到了一个小技巧:
用”;”可以隔断system的输入
于是,只要把buffer的位置写成”;sh;”,就可以拿到shell了。
难受。。。。。。。
Silver Bullet
这道题找到漏洞之后思路就不难了。
首先是那个strncat函数,在查阅了资料之后发现了很重要的一点:
strncat()会将dest字符串最后的’\0’覆盖掉,字符追加完成后,再追加’\0’。
对,就是这个字符串结尾的字符0,刚好可以覆盖掉size的低位,使size置0。
于是就可以利用这一点再次读取数据,造成溢出。
main函数在打败敌人之后才会正常返回,所以需要先找到打败敌人的方法,用16进制查看很容易发现敌人的hp+1之后就会变成一个负数,所以只要之后的读入中吧size所在的地方覆盖成一个负数即可。
第一次溢出的时候先用puts leak出got表的信息,再返回到main函数再次溢出,就可以很容易的拿到shell。
(没有放exp字数好少)