格式化字符串漏洞实验

格式化字符串漏洞是由像 printf(user_input) 这样的代码引起的,其中 user_input 是用户输入的数据,具有 Set-UID root 权限的这类程序在运行的时候,printf 语句将会变得非常危险。

  • 实验一:

找出 secret[1]的值

输入命令:

ls
vi test.c
gcc -z execstack -fno-stack-protector -o djw test.c

其中test.c的代码为

include <stdlib.h>
include <stdio.h>define SECRET1 0x44
define SECRET2 0x55int main(int argc, char *argv[])
{char user_input[100];int *secret;long int_input;int a, b, c, d; /* other variables, not used here.*//* The secret value is stored on the heap */secret = (int *) malloc(2*sizeof(int));/* getting the secret */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);  /* getting an input from user */printf("Please enter a string\n");scanf("%s", user_input); /* getting a string from user *//* Vulnerable place */printf(user_input);  printf("\n");/* Verify whether your attack is successful */printf("The original secrets: 0x%x -- 0x%x\n", SECRET1, SECRET2);printf("The new secrets:      0x%x -- 0x%x\n", secret[0], secret[1]);return 0;
}

编译后进行执行,如图

首先定位 int_input 的位置,这样就确认了%s 在格式字符串中的位置(由于与文档上000000000000000C不一致,所以要进一步确定位置)
用%08x进行显示,如图

输入 secret[1]的地址,记得做进制转换,同时在格式字符串中加入%s,如图

U 的 ascii 码就是 55。

修改 secret[1]的值

如果只要求修改,不要求改什么,可以利用%n进行修改,修改如下:

修改 secret[1]为期望值

要改成自己期望的值,可以进行填充:

%n可以进行计数,0x3e8 = 1000。

  • 实验二:

include <sys/types.h>
include <sys/stat.h>
include <fcntl.h>
int main()
{char buf[1000];int fp, size;unsigned int *address;/* Putting any number you like at the beginning of the format string */address = (unsigned int *) buf;*address = 0x113222580;/* Getting the rest of the format string */scanf("%s", buf+4);size = strlen(buf+4) + 4;printf("The string length is %d\n", size);/* Writing buf to "mystring" */fp = open("mystring", O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);if (fp != -1) {write(fp, buf, size);close(fp);} else {printf("Open failed!\n");}
}

现在让我们把第一个实验中的 scanf 语句去掉,并去掉与 int_input 变量相关的所有语句,同时设置关闭地址随机化选项。操作如下:


在这里,刚开始碰到了问题,权限不够。后来用sudo进行提权,要输入密码,根据以往设计者的情况,密码为dees,进行提权后指令即可执行成功。

修改 secret[0]的值

修改 test.c 后编译 test.c 与 write_string.c 然后通过 write_string 程序将内容输入进 mystring 文件中,文件内容包括代码中加入的头四个字节和你之后输入的内容。实验过程如下:

在这里试验了好多次,由于刚开始没有找准位置,以为./test不需要,./write_string之后直接按之前的位置安放%n进行输入就好。导致The original secrets和The news secret内容一致,甚至出现segmentation fault的情况。后来总结了一下,重新对test进行测试,找准了位置,再进行上面命令的输入,就得到了准确的结果。
0x31=49=5*8+5个逗号+开头4个字节。

转载于:https://www.cnblogs.com/Jarvan210/p/6160643.html

20169212《Linux内核原理及分析》第十二周作业相关推荐

  1. 2018-2019-1 20189204《Linux内核原理与分析》第三周作业

    OS是如何工作的 学习任务: 阅读学习教材「庖丁解牛Linux 」第2章 学习蓝墨云班课中第三周视频「操作系统是如何工作的?」,并完成实验楼上配套实验二. 云班课学习笔记: 计算机三大法宝 程序存储计 ...

  2. 《Linux内核原理与分析》第五周作业

    课本:第4章 系统调用的三层机制(上) -用户态.内核态和中断 -用户态:在低的执行级别下,代码能够掌控的范围有所限制,只能访问部分内存. -内核态:在高的执行级别下,代码可以执行特权指令,访问任意的 ...

  3. 20189220 余超《Linux内核原理与分析》第八周作业

    Linux内核如何装载和启动一个可执行程序 本章知识点 ELF(Executable and Linking Format)是一种对象文件的格式,用于定义不同类型的对象文件(Object files) ...

  4. 20189220 余超《Linux内核原理与分析》第七周作业

    分析Linux内核创建一个新进程的过程 基础知识概括 操作系统内核实现操作系统的三大管理功能,即进程管理功能,内存管理和文件系统.对应的三个抽象的概念是进程,虚拟内存和文件.其中,操作系统最核心的功能 ...

  5. 2022-2023-1 20222816《Linux内核原理与分析》第三周作业

    1.实验要求 完成一个简单的时间片轮转躲到程序内核代码 2.实验过程 进入实验楼,打开shell,输入一下代码: 实验结果: 3.mykernel时间片轮转代码分析 mypcb.h头文件,用来定义进程 ...

  6. 20222817《Linux内核原理与分析》第七周作业

    分析 Linux 内核创建一个新进程的过程 1.实验过程 下载新menu替换原来的menu并make: 使用gdb设置断点并调试,调试过程如下图所示: 2.实验分析及总结 do_fork关键代码分析 ...

  7. 2018-2019-1 20189206 《Linux内核原理与分析》第六周作业

    linux内核分析学习笔记 --第五章 系统调用的三层机制 学习重点--深入理解系统调用的过程 给MenuOS添加命令 添加命令的方式较为简单,在LinuxKernel/menu/test.c目录下, ...

  8. 20169210《Linux内核原理与分析》第十一周作业

    第17章 设备与模块 关于设备驱动和设备管理,讨论四种内核成分. 设备类型:在所有的linux系统中为了统一普遍设备的操作所分的类. 模块:Linux内核中用于按需加载和卸载目标码的机制. 内核对象: ...

  9. 20169207《Linux内核原理与分析》第五周作业

    这周的任务主要分为两个方面,第一方面,学习MOOC网上视频第三讲并完成配套的实验.第二方面,学习课本的第四章和第六章. 首先从实验开始讲起,前期我们对Linux内核的源码做了一个简单的了解.包括Mai ...

  10. 2018-2019-1 20189206 《Linux内核原理与分析》第五周作业

    linux内核分析学习笔记 --第四章 系统调用的三层机制 学习重点--系统调用 用户态.内核态和中断 Intel x86 CPU有四种不同的执行级别,分别是0,1,2,3其中数字越小,特权越高. L ...

最新文章

  1. php 7.2 安装 mcrypt 扩展(亲测)
  2. python 扫盲系列(1)
  3. android 自定义baseadapter listview,android之ListView和BaseAdapter的组合使用
  4. php字符型和数字型的注入,Sql注入的分类:数字型+字符型
  5. Transformers Assemble(PART II)
  6. JS 动态修改json字符串
  7. uploadify 302 php,jQuery Uploadify 上传插件出现Http Error 302 错误的解决办法
  8. 超级详细的Maven使用教程
  9. 解决 fxp/composer-asset-plugin 包报错问题
  10. 美杜莎(Medusa)
  11. python转cython_10分钟带你入门Cython
  12. Flask模板中可以直接访问的特殊变量和方法
  13. 数理统计笔记1:常用分布
  14. Redis基本事务的操作
  15. matlab 声源定位csdn_麦克风阵列声源定位 GCC-PHAT(一)
  16. Arduino实时时钟设计(TM1637数码管显示)
  17. 【Unity】Asset Pipeline Version 2(Asset Database v2)内部细节
  18. 如何偷改 millis( ) 与 micros( )的值方便测试(教程)(定时器相关)
  19. 【附源码】计算机毕业设计SSM网上书城系统
  20. 你是那种只看《XXXXX从入门到精通》的程序员吗?

热门文章

  1. php7版本搭建sqli labs,CentOS 7 LAMP搭建并且部署sqli-labs
  2. Python入门-try-except-else-finally
  3. 时针与分针的夹角的易错点
  4. 计算机组成原理—数据的表示、运算与校验(思维导图)
  5. huffman树--静态链表和链表实现(借助优先队列)
  6. UnityShader30:预编译指令multi_complie和shader_feature
  7. 喵哈哈村的嘟嘟熊魔法(四)(set+对组)
  8. 第七次CCF-D:游戏
  9. 多维数组-创建多维数组
  10. 纯小白成功安装交叉编译工具arm-none-eabi-gcc