HackThisSite - Extended Basic Mission 01

Challenge

You have to give input to a C program which gives you the length of the string. How would you crash it?

给一个会给出字符串长度的 C 程序喂输入,怎样把它搞崩?

1
2
3
4
5
void blah(char *str)
{
char lol[200];
strcpy(lol, str);
}

Solution

blah 实质只有两步:在栈上声明 200 字节的 lol,把调用方的字符串整段拷进去。strcpy 的原型是 strcpy(char *dst, const char *src),它只拿到源和目标两个地址,不接收目标容量,于是拷贝多少字节完全由 src 里 NUL 的位置决定:写 strlen(src) + 1 个字节(含结尾的 NUL),中途不做任何边界检查。

lolblah 栈帧里的局部数组,紧邻它的更深处是保存的帧指针和返回地址。当 strlen(str) >= 200 时,strcpy 写出的字节越过 lol 的边界压到相邻栈数据上;返回地址一旦被非预期字节覆盖,blah 执行 ret 时就跳向垃圾地址,进程随即崩溃。