JDo*_*oby 3 c stack buffer overflow
我的朋友最近完成了一项黑客挑战并将其发送给我(二进制文件和源代码)。在向他寻求建议之前我想先在这里问一下,因为我想自己做:)
我一直在经历它,但我正在努力寻找漏洞。
#include <alloca.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
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]) < 2) {
fprintf(stderr, "bad command \"%s\"\n", argv[i]);
return 1;
}
index = atoi(argv[i] + 1);
if (index >= length) {
fprintf(stderr, "bad index in command \"%s\"\n", argv[i]);
return 1;
}
buffer[index] = argv[i][0];
}
printf("%s\n", buffer);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我认为该漏洞存在于short int 和alloca 的使用中。
输入./app 65535 65535可能会导致段错误,但我实际上无法覆盖任何内容,因为缓冲区只会设置为最大 65535 或者它会循环。这让我觉得我无法覆盖 EIP 来注入 shellcode。
谁能帮我看看哪里可以看吗?
谢谢!
实际上,该漏洞在于您可以在 分配的缓冲区中的任意偏移处存储字符alloca,但测试是在 上进行的,length而不是在 上进行的size。65535传递和的参数a1会调用未定义的行为: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 ...
Run Code Online (Sandbox Code Playgroud)
根据实际的局部变量布局,所需的偏移量可能大于17,但应小于80。
| 归档时间: |
|
| 查看次数: |
1715 次 |
| 最近记录: |