黑客挑战 – 在代码中查找漏洞

我的朋友最近完成了一次黑客挑战并将其发送给我(二进制和源代码)。 我之前想问他提示,因为我想自己做:)

我一直在经历它,但我正在努力找到这个漏洞。

#include  #include  #include  #include  static void usage(const char *argv0) { printf("Build your own string!\n"); printf("\n"); printf("Usage:\n"); printf(" %s length command...\n", argv0); printf("\n"); printf("Each command consist of a single character followed by it's index.\n"); printf("\n"); printf("Example:\n"); printf(" %s 11 h0 e1 l2 l3 o4 w6 o7 r8 l9 d10\n", argv0); exit(1); } int main(int argc, char **argv) { char *buffer; unsigned short buffersize, i, index, length; if (argc < 2) usage(argv[0]); length = atoi(argv[1]); if (length <= 0) { fprintf(stderr, "bad length\n"); return 1; } buffersize = length + 1; buffer = alloca(buffersize); memset(buffer, ' ', buffersize); buffer[buffersize - 1] = 0; for (i = 2; i < argc; i++) { if (strlen(argv[i]) = length) { fprintf(stderr, "bad index in command \"%s\"\n", argv[i]); return 1; } buffer[index] = argv[i][0]; } printf("%s\n", buffer); return 0; } 

我认为漏洞在于short int,以及alloca的使用。

输入./app 65535 65535可能会导致段错误,但实际上我无法覆盖任何内容,因为缓冲区只会设置为最大65535或循环。 这让我觉得我无法覆盖EIP来注入shellcode。

任何人都可以帮我看看哪里?

谢谢!

实际上,漏洞在于您可以在使用alloca分配的缓冲区中的任何偏移处存储字符,但测试是在length而不是size 。 传递65535a1参数会调用未定义的行为: size为值0因为如果unsigned short具有16位,则算术回绕。

您可以尝试传递65535的第一个参数和后续参数以及增加的偏移量,这将使值超出buffer的末尾,可能会覆盖main的返回地址并导致崩溃:

 myprog 65535 a3 a7 a15 a19 a23 a27 a31 a35 a39 a43 a47 a51 a55 a59 a63 ... 

根据实际的局部变量布局,所需的偏移量可能大于17 ,但应小于80