课上测试
测试-3-ch02
- 任务详情
- 编写一个程序 “week0203学号.c",运行下面代码:
1 short int v = -学号后四位
2 unsigned short uv = (unsigned short) v
3 printf("v = %d, uv = %u\n ", v, uv);
- 在第三行设置断点用gdb调试,用p /x v; p /x uv 查看变量的值,提交调试结果截图,要全屏,要包含自己的学号信息
- 分析p /x v; p /x uv 与程序运行结果的不同和联系
- 相关知识
- 有符号和无符号数之间的转换
- C语言允许在各种不同的数字数据类型之间做强制类型转换。
- 强制类型转换的结果保持位值不变,只是改变了解释这些位的方式。
- gdb调试
- b (line number):在某行设置行断点
- r:运行
- c:继续运行
- p:print
- /x:十六进制
- q:退出gdb
- p/x v和 p/x uv之间的联系在于有符号数和无符号数之间的转换,其数值可能会变,但位模式不会变
- 代码
#include<stdio.h>
void main(){
short int v = -5212;
unsigned short uv = (unsigned short) v;
printf("v = %d, uv = %u\n ", v, uv);
}
- 运行结果
课下作业
缓冲区溢出漏洞实验
缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况。这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段。这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写。
- 实验准备
- 实验步骤及过程
- 关闭猜测内存地址功能
- 设置 zsh 程序进一步防范缓冲区溢出攻击及其它利用 shell 程序的攻击
- 进入32位linux环境,输入“/bin/bash”使用bash进行Tab补全
- shellcode:用来发送到服务器利用特定漏洞的代码,一般可以获取权限
- 编译漏洞程序并设置 SET-UID(其中需要用
–fno-stack-protector
关闭栈的保护机制以阻止其阻止缓冲区溢出,-z execstack
用于允许执行栈) - 攻击漏洞程序,并通过攻击获得 root 权限
- 编写
exploit.c
(在代码中要找到shellcode在内存中的地址,并于0x64进行加运算得到0xffffd0c4填入exploit.c
) - 编译
exploit.c
:gcc -m32 -o exploit exploit.c
- 编写
- 攻击结果
- 运行攻击程序:
./exploit
- 运行漏洞程序:
./stack.c
- 运行攻击程序:
- 关闭猜测内存地址功能
- 实验结果
实验中遇到的问题
在最后进行攻击时运行结果一直显示“段错误”,我查看之前的步骤做了好几遍还是这样
解决办法:最后我发现我第一次做的时候在进行一些准备设置后,退出了linux32系统,在实验楼中开始进行后续的创建c文件,又进入到了linux32字运行,这是错误的,实验全程应在linux32环境中进行,我把之前创建的文件全部删除重新创建后运行成功。