SCU【C】程序设计基础期末安全项目lab2-Deadbeef-writeup(附题目&源码)

这篇具有很好参考价值的文章主要介绍了SCU【C】程序设计基础期末安全项目lab2-Deadbeef-writeup(附题目&源码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目名称

和lab1一样,此题又是美国卡耐基梅隆大学的平时作业哈哈哈

Lab2-Deadbeef(本质:栈溢出攻击)

项目环境 

表1 项目开发环境

硬件环境

CPU

Intel Core i5,2.4 GHZ

内存

8G

操作系统

Windows

10,Professional版本

开发IDE

VS

2022版本

题面:

项目过程和结果的描述

SCU【C】程序设计基础期末安全项目lab2-Deadbeef-writeup(附题目&源码),c语言,安全,开发语言

大家都知道函数返回值要么是int要么是bool类型吧,然而这道题要我们的函数返回值是0xdeadbeef ???

怎么办?我的想法是栈溢出,暴力更改函数返回值。

源码:

/* bufbomb.c
 *
 * Bomb program that is solved using a buffer overflow attack
 *
 * program for CS:APP problem 3.38
 *
 * used for CS 202 HW 8 part 2
 *
 * compile using
 *   gcc -g -O2 -Os -o bufbomb bufbomb.c
 */

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

 /* Like gets, except that characters are typed as pairs of hex digits.
    Nondigit characters are ignored.  Stops when encounters newline */
char* getxs(char* dest)
{
    int c;
    int even = 1; /* Have read even number of digits */
    int otherd = 0; /* Other hex digit of pair */
    char* sp = dest;
    while ((c = getchar()) != EOF && c != '\n') {
        if (isxdigit(c)) {
            int val;
            if ('0' <= c && c <= '9')
                val = c - '0';
            else if ('A' <= c && c <= 'F')
                val = c - 'A' + 10;
            else
                val = c - 'a' + 10;
            if (even) {
                otherd = val;
                even = 0;
            }
            else {
                *sp++ = otherd * 16 + val;
                even = 1;
            }
        }
    }
    *sp++ = '\0';
    return dest;
}

int getbuf()
{
    char buf[16];
    getxs(buf);
    return 1;
//可以看到,不管输入什么到buf数组里面,函数都会返回1,而非0xdeadbeef.
}

void test()
{
    int val;
    printf("Type Hex string:");
    val = getbuf();
    printf("getbuf returned 0x%x\n", val);
}

int main()
{
    int buf[16];
    /* This little hack is an attempt to get the stack to be in a
       stable position
    */
    int offset = (((int)buf) & 0xFFF);
    int* space = (int*)malloc(offset);
    *space = 0; /* So that don't get complaint of unused variable */
    test();
    return 0;
}

2023年12月31日&1月1日

核心思路:通过把buf数组填满,继续填满下面的值,栈溢出,一直到给val赋值的地方。暴力破解。    

下面展示思路:

  1. 对题面,程序进行解读,并详细做了注释

       项目要求是把栈溢出,强行更改函数返回值,输出0xdeadbeef。

       2.随便输一个值进去,输出0x1,
SCU【C】程序设计基础期末安全项目lab2-Deadbeef-writeup(附题目&源码),c语言,安全,开发语言

而通过源代码可知,

0x1=val的值=getbuf()的值,看到getbuf()函数返回值为1

直接修改函数返回值是对我来说比较困难的,所以我们想让val输出:0xdeadbeef,所以就想通过栈溢出的方式,让value=0xdeadbeef.

核心思路:通过把buf数组填满,继续填满下面的值,栈溢出,一直到给val赋值的地方。暴力破解。    

所以接下来,我们绘制了一个堆栈表:先通过调出寄存器找到栈底RBP地址,看内存得到RBP存的值,取地址:&value= 

SCU【C】程序设计基础期末安全项目lab2-Deadbeef-writeup(附题目&源码),c语言,安全,开发语言

名称

类型

&val

0x0073f7f0 {-858993460}

int *

等会我们就要尝试修改&val然后让val的值改变。

查看反汇编代码:call、调用getbuf()函数;

SCU【C】程序设计基础期末安全项目lab2-Deadbeef-writeup(附题目&源码),c语言,安全,开发语言

 dword ptr [val],eax把函数返回值赋值给val。

Printf的地址是00411A0A,我们要把00411A07(赋值函数地址)改变成00411A0A(printf的地址)

继续运行到getxs()函数:发现EBP变了

SCU【C】程序设计基础期末安全项目lab2-Deadbeef-writeup(附题目&源码),c语言,安全,开发语言

看看存了什么:

看看内存

看看buf数组的地址:

SCU【C】程序设计基础期末安全项目lab2-Deadbeef-writeup(附题目&源码),c语言,安全,开发语言 SCU【C】程序设计基础期末安全项目lab2-Deadbeef-writeup(附题目&源码),c语言,安全,开发语言

核心思路:通过把buf数组填满,继续填满下面的值,栈溢出,一直到给val赋值的地方。暴力破解。     

三角形部分为要填入程序的东西,中间空的内存值不能随便填,查内存,删空格(我写了一个程序删),原始数据如图,接下来是处理后的数据:

SCU【C】程序设计基础期末安全项目lab2-Deadbeef-writeup(附题目&源码),c语言,安全,开发语言SCU【C】程序设计基础期末安全项目lab2-Deadbeef-writeup(附题目&源码),c语言,安全,开发语言

把这一堆输入程序,回显0xdeadbeef:

凌晨2:08,终于对了,我太感动了:

SCU【C】程序设计基础期末安全项目lab2-Deadbeef-writeup(附题目&源码),c语言,安全,开发语言

嗷嗷嗷,程序员小姐姐给大家准备了一个彩蛋

有人好奇为什么叫0xDeadbeef吗

SCU【C】程序设计基础期末安全项目lab2-Deadbeef-writeup(附题目&源码),c语言,安全,开发语言

刚看到这段代码时,我是比较吃惊的,作者竟然使用了一个英文单词 deadbeef 来定义宏常量!

我本来以为只是一位幽默的程序员的小玩笑,但后来查阅资料才知道,上图的这段代码竟是 C++ 的 hash_map 源码!而作者使用这个特殊的英文单词也是 “别有用心”。

deadbeef 的英文直译是死牛肉,但在编程领域中,它却有更深层的含义。给这个单词加上 0x 、再转换为大写,就得到了一个典型的十六进制数字:0xDEADBEEF。这个数字经常用来标识新分配但是还未初始化的内存;在嵌入式系统中,也常常用它来表示程序崩溃或者出现了死锁,比如运行在 32 位 PowerPC 处理器上的 IBM RS/6000 系统、Mac OS 系统。

那我不禁感到好奇,为什么选择了这样一个单词,而不是 “FishPi” 之类的(开个玩笑,16 进制最多到 F)。

SCU【C】程序设计基础期末安全项目lab2-Deadbeef-writeup(附题目&源码),c语言,安全,开发语言

到网上查了一会,得到的结论竟然是:没什么理由,它是一个 “魔数”!

所谓魔数,就是毫无理由、凭空出现、也不需要去解释其含义的常量。就是这么任性!

除了 deadbeef 外,我还百度到了很多魔数,比如:

  • 0xBAADF00D ("bad food" 烂饭) 被微软的 LocalAlloc(LMEM_FIXED)使用,在使用调试堆时指示未初始化的已分配堆内存
  • 0xDEADC0DE ("dead code" 死码) 在 OpenWRT 固件中用作标记,在静态固件的末尾表示要创建的 jffs2 文件系统的开始
  • 0xDEAD10CC ("dead lock" 死锁) 用于表示 iOS 系统的闪退报告

是不是感觉很神奇?也许这就是程序员的浪漫吧。文章来源地址https://www.toymoban.com/news/detail-825838.html

到了这里,关于SCU【C】程序设计基础期末安全项目lab2-Deadbeef-writeup(附题目&源码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Python程序设计】——重点题目(期末不挂科)

    课本: 【例3-6】计算分段函数值。 y = { cos ⁡ x + x 2 + 1 ( x 0 ) x x + x ( x ⩾ 0 ) y=left{begin{array}{ll} cos x+sqrt{x^{2}+1} (x 0) \\\\ x sqrt{x+sqrt{x}} (x geqslant 0) end{array}right. y = { cos x + x 2 + 1 ​ x x + x ​ ​ ​ ( x 0 ) ( x ⩾ 0 ) ​ 【例3-7】简化PM 2.5空气质量提醒: 0~35为优,35~75为良,75以

    2024年02月11日
    浏览(29)
  • C++程序设计期末考试复习试题及解析 3(自用~)

    可以很清楚看到浅拷贝所造成的错误:在析构的时候会重复析构,这是由于浅拷贝时,b的buffer指针和a的buffer指针指向的是同一片空间 如何更改? 换为深拷贝! 即弃用默认拷贝构造函数,自己写一个拷贝构造函数 改为深拷贝后,a、b对象不会相互影响,由于b未调用set()函

    2024年02月09日
    浏览(32)
  • 微信小程序:期末大作业,毕业设计茶客堂商城微信小程序

    茶客堂微信小程序是一个为茶叶爱好者提供优质茶叶和茶文化知识的平台。茶作为中国的传统文化,越来越受到各个年龄层的人们的喜爱。而传统的茶叶销售方式有一定的局限性,如茶叶品质无法保证、价格不透明等。茶客堂微信小程序应运而生,致力于打造一个集购茶、品

    2024年02月11日
    浏览(35)
  • C语言程序设计期末大作业(学生信息管理系统)(可自取源码)

    高校学生信息管理系统 (一)在高校学生管理系统中包含九个主要操作: 退出系统; 学生信息的录入; 学生信息的打印; 学生信息的保存; 学生信息的读取; 学生人数的统计; 学生信息的查找; 学生信息的修改; 学生信息的删除。 (二)设计流程 首先确认用switch ca

    2024年02月10日
    浏览(42)
  • C#程序设计之windows应用程序设计基础

    题目描述 设计一个“简单通讯录”程序,在窗体上建立一个下拉式列表框、两个文本框和两个标签,实现以下功能:当用户在下拉式列表框中选择一个学生姓名后,在“学生姓名”、“地址”两个文本框中分别显示出对应的学生和地址。 代码 窗体代码 运行结果 题目描述 设

    2024年02月06日
    浏览(35)
  • 【软件设计师07】程序设计语言与语言处理程序基础

    编译与解释、文法、正规式、有限自动机、表达式、传值与传址、多中程序语言特点 (逐渐降低考察比例,很少考察) 概念 文法类型 语法推导树 有限自动机 与正规式(重点) 常见问题:给一个串比如01、10、001等,看图中起点到终点能否连起来得到这样的串 正规式 是有限自

    2023年04月08日
    浏览(45)
  • 四种Bootloader程序安全机制设计

    正文 大家周末好,我是bug菌~ 不管是玩单片机还是嵌入式linux,基本上都会接触到bootloader,所以bootloader程序也是一个关键的组件,进行硬件初始化,应用程序的合法性、完成性检测、升级功能等等都与其息息相关。 像一些在ram运行的应用程序,或者是一些运行内存比较小的

    2024年02月09日
    浏览(21)
  • Python程序设计基础:程序流程控制(一)

    程序流程的基本结构主要有三种,顺序结构、选择结构和循环结构,在顺序结构中是按照语句的位置一句一句顺序执行,每条语句有且只会执行一次,而在选择结构和循环结构中,通常是需要根据条件表达式的值来确定下一步的执行流程。 条件表达中一般使用两种运算符:关

    2024年02月11日
    浏览(35)
  • 程序设计 算法基础

    ✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 时间复杂度和空间复杂度是衡量一个算法效率

    2024年02月14日
    浏览(26)
  • python程序设计基础 实验三

    ⭐python实验专栏,欢迎订阅与关注! ★观前提示 :本篇内容为python程序设计实验,代码内容经测试没有问题,但是可能会不符合每个人实验的要求,因此以下内容建议仅做思路参考。 一、实验目的 (1)掌握Python各种函数的使用。 二、实验内容 1、编写函数,求三个整数的

    2023年04月13日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包