Defcon 20 CTF p200 writeup

刚开始分析的时候注意到程序会从/dev/urandom中读取随机数,后来发现这只是用来迷惑分析者的,并不影响网络的读写。
程序一开始要求客户端给出口令,照着输入就可以了。
进入关键函数如下:

首先读取一个16进制字符串的userid,经过check_userid后,进入fgetc循环,每次读取一个字符,与userid进行异或后写入buffer[512],这里没有进行溢出检查,只根据字符是否是回车(0x0a)来判断终止,此处正是漏洞所在。但并不是就那么简单,注意到函数返回前还有一个对protection变量的检查,如果检查不通过,函数不返回就直接退出了,而protection变量正处在buffer的覆盖区,变量值中有一个字节正是0x0a,所以我们无法通过覆盖protection的方法来产生溢出。但是注意到,堆栈的待覆盖区还有一个变量index,在fgetc循环中,程序根据index数值来选择覆盖的位置,因此我们覆盖Index的LSB时可以小心的加上一些数n,这样下一次循环的时候就会覆盖下面第n+1个字节,可以利用这点来跳过protection,进而覆盖返回地址。

取n=0x0b,写出渗透代码如下(写入的新返回地址通过gdb调试得到):

此条目发表在Uncategorized分类目录。将固定链接加入收藏夹。

评论功能已关闭。