在Bugku的pwn题中,这道题分值最高,也是难度最大的一道。难点在于,第一要读懂题目找出漏洞,第二是要绕过各种保护机制,第三是exp的编写调试。看一眼程序的保护机制,发现除了RELRO所有保护全开,还是有点头疼的,毕竟我刚开始学pwn没几天,还没有做过PIE和Canary的题目,所以调试还是花了不少时间的。
首先分析程序,重要部分如下所示。一开始会让你输入一个路径,不存在的话就会报错退出,然后打印出文件内容;以上均可以忽略,没有任何用处。然后分别输入note的长度和内容,输入内容的长度取决于之前的note长度;如果实际输入的长度不是624,则再输入一遍,此时输入内容的长度变为0x270(624)。可以发现,v4的长度为0x258(600),而输入的长度可以任意控制,因此存在栈溢出。
puts("write some note:");
puts(" please input the note len:");
*(_DWORD *)nbytes = 0;
__isoc99_scanf("%d", nbytes);
puts("please input the note:");
read(0, &v4, *(unsigned int *)nbytes);
puts("the note is: ");
puts(&v4);
if ( strlen(&v4) != 624 )
{
puts("error: the note len must be 624");
puts(" so please input note(len is 624)");
read(0, &v4, 0x270uLL);
}
return __readfsqword(0x28u) ^ v5