【发布时间】:2017-05-09 20:38:11
【问题描述】:
我正在做一些关于缓冲区溢出的练习,目前我不知道如何进一步处理其中一个问题。这是程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/syscall.h>
void reverb(char *msg, unsigned int len) {
unsigned char length = (unsigned char) len;
char buffer[250] = "Printed: ";
strcat(buffer + 9, msg);
if ((length > 75) || (length < 15)) {
fprintf(stderr, "Error: invalid string length");
exit(1);
}
else {
fprintf(stdout, "%s\n", buffer);
}
}
int main(int argc, char **argv) {
//argument check
if (argc != 2) {
fprintf(stderr, "Invalid arguments!\n");
return 1;
}
reverb(argv[1], strlen(argv[1]));
return 0;
}
所以基本上很明显,这个程序应该只是重新打印你给它的参数。我显然必须利用其中一个使用的函数,我怀疑这里的罪魁祸首是 strcat。但是,当我想完成堆栈粉碎时,我遇到了length 变量的问题。
为了能够导致段错误并成功找到发生溢出的点,我需要传递一个长度约为 255+ 的参数(现在不确定当前数字,但它在某个附近),这对于我的 75 字符限制是不可行的。使用 gdb 并在 strcat 之后设置断点,我能够在内存中找到 buffer 的位置(有点简单,只是因为我用 A 向它发送了垃圾邮件,所以该区域填充了 0x41)。 length 的位置有点棘手,但问题出在 - 它位于缓冲区之前,这意味着如果我愿意,我什至无法覆盖它。但是,我认为我仍然需要以某种方式覆盖它才能进入 else 分支。而且我一直被困在这一点上,看不到正确进行的方法。
【问题讨论】:
-
提示:如果
len超过char的大小会怎样? ;) -
您希望
len % 255介于 15 到 75 之间。因此,将 255 的任意倍数添加到 15 到 75 之间的任意数字中。 -
"这个程序应该只是重新打印你给它的参数。" --> 如果参数的长度为 256,则不是。@MadPhysicist Off-by-one:它是“
len % 256在 15 到 75 之间” -
@chux。你是绝对正确的。在我之前的评论中将 255 替换为 256。
-
@Siguza
void reverb(char *msg, unsigned int len) ... reverb(argv[1], strlen(argv[1]));是否给出编译器警告?是否启用所有警告? `
标签: c linux buffer-overflow strcat