计算机网络原理实验
实验环境:Linux Kernel 3.16.0//Debian 3.16.7(32位)//GCC 4.9.2
2016年4月19日
作业五:缓存区溢出实验
实验一
题目:
利用lab.c代码完成作业,当然你也可以使用自己写其他的代码完成。程序要求使用Set-UID获取root权限,在程序中存储了两个数值,SECRET1和SECRET2;这两个值,我们假设我们预先不知道,作为攻击者,我们想要知道这两个值;这两个字,我们设定为0x44和0x55。虽然我们不知道这两个数值,但是,在实际操作中,我们可以知道它们的内存地址或者大概的内容地址的范围(简单起见,程序中这两个数字的地址肯定是相邻的)。这次实验,假设我们已经知道了确切的地址,并打印出来了。因此,我们需要完成如下目标(不需要同时完成):
1.Crashing down 程序;
2.打印出secret[1]的值;
3.修改secret[1]的值;
4.修改secret[1]的值,值和3不同;
注意:你们可以将程序设置Set-UID,但是一旦写完程序以后,它就是二进制代码,你不能修改你的二进制代码。虽然,我给了你们一个实例(可攻击)的源码,辅助你们进行攻击,你可以修改,采用别的方式,但是你只能在二进制可执行程序前面,进行攻击。
//File: lab.c
#define SECRET1 0x44
#define SECRET2 0x55
int main(int argc, char *argv[])
{
char user_input[100];
int *secret;
int int_input;
int a, b, c, d;
secret = (int *) malloc(2*sizeof(int));
secret[0] = SECRET1; secret[1] = SECRET2;
printf("The variable secret's address is 0x%8x (on stack)\n", &secret);
printf("The variable secret's value is 0x%8x (on heap)\n", secret);
printf("secret[0]'s address is 0x%8x (on heap)\n", &secret[0]);
printf("secret[1]'s address is 0x%8x (on heap)\n", &secret[1]);
printf("Please enter a decimal integer\n");
scanf("%d", &int_input);
printf("Please enter a string\n");
scanf("%s"