【C语言】SCU安全项目2-BufBomb

目录

关键代码解读:

getxs()

getbuf()

test()

核心思路

具体操作1

具体操作2


前段时间忙于强网杯、英语4级和一些其他支线,有点摸不清头绪了,特别是qwb只有一个输出,太过坐牢,决定这个安全项目做完后就继续投身web的修炼,向C语言暂时说拜拜!!!

前置知识:

C语言函数调用栈

贴出源码:

/* 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;elseval = 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;
}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 astable 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;
}

关键代码解读:

getxs()

这段代码定义了一个函数 getxs,它接受一个参数 dest,类型为 char*。函数的作用是从标准输入中读取一串十六进制数字,并将其转换为对应的字符序列,最后将结果存储在 dest 指向的内存空间中。

代码中使用了一个 while 循环来逐个读取输入的字符,直到遇到文件结束符(EOF)或换行符('\n')为止。在循环体内部,首先判断当前字符是否是一个十六进制数字,这由 isxdigit 函数来判断。

如果是十六进制数字,根据其值计算出对应的十进制数。如果当前已经读取了偶数个数字,则将该数字保存在 otherd 变量中,并将 even 标志位设置为 0,表示下一个数字是一个新的十六进制数字的开始。如果当前已经读取了奇数个数字,则将 otherd 乘以 16 并加上当前数字的值,将结果存储在 sp指向的内存空间中,sp指向地址增加一个字节,并将 even 标志位设置为 1。

循环结束后,将字符串的终止符 '\0' 存储在sp 指向的内存空间中,并返回指向 dest 的指针作为函数的返回值。

总而言之,这段代码实现了将输入的十六进制数字转换为字符序列的功能。

比如想输入deadbeef,则要输入efbeadde(小端存储,不解释)

getbuf()

 先是定义一个16个字节长度的字符型数组,讲数组首地址传入getxs函数,最后返回一个1。

这里就存在一些栈溢出的手段,暂按不表。

test()

定义了一个整形变量val,打印"Type Hex string",将val赋值为getbuf()的返回值(这里为1),最后将val的16进制型打印出。如果我们放任不管的话,无论输入什么值,因为无法改变getbuf()的返回值,所以回显一定如下。

但实验要求是让我们输出getbuf returned 0xdeadbeef,我们该怎么入手呢?

核心思路

以我浅薄的C语言能力应该无法修改getbuf的返回值为deadbeef,所以想到可以利用栈溢出的方式跳过val的赋值语句,直接运行第二个printf函数,而val的值也通过溢出覆盖为期望的deadbeef。

而buf[16]和getxs函数的配合恰好可以满足我们搞破坏的需求。

一行输入的内容超过了16字节,getxs并不会停止读入,此时的读入已经超出了数组范围(数组访问越界),从而实现覆写改变高地址处内容。

具体修改什么内容呢?

主要有两个部分:getbuf()函数的返回地址(从而直接跳转到第二个printf,不执行赋值操作)和val的初始值

具体操作1

设个断点开始调试,进入test函数

看寄存器状态,得知EBP地址为0019FDB4

看一眼 EBP地址里存的内容为0019FEE8(原原EBP地址,即test函数栈帧的原EBP地址——main函数的EBP地址,这里其实不太严谨,但为了后续方便表述所以用了两个原)

再看内存中val的地址,为0019FDAC

(内容是cccccccc说明val变量还未初始化)

看汇编代码得知val赋值语句和第二个printf的地址分别为004119D7,004119DA

 到此为止我们可以先用表格做个总结

 

具体操作2

跟进调试,进入getbuf函数,栈帧切换为getbuf

 看一眼寄存器,发现新EBP地址为0019FCD4

在内存里查看新BEP地址里存的值,发现为原EBP地址(即test函数栈帧EBP地址)0019FDB4

 看一下0019FDB8和0019FDBC里存的值,发现分别是val赋值语句的函数返回地址(004119D7)和原原EBP地址(0019FEE8)。

这里凡是相关EBP地址的内容我们都不能改,不然会报错,但是函数返回值可以任由我们操纵。

我们可以把0019FDB8的值由004119D7改为004119DA,这样就可以跳过赋值语句直接printf。

最后再看一眼buf数组的首地址为0019FCC0,因为是16个char,所以占四字节

 我们可以用表格模拟当前栈的分布情况

最终payload:

12345678 12345678 12345678 12345678 12345678 B4FD1900 DA194100 E8FE1900 12345678 12345678 12345678 12345679 12345680 12345681 12345682 12345683 12345684 12345685 12345686 12345687 12345688 12345689 12345690 12345691 12345692 12345693 12345694 12345695 12345696 12345697 12345698 12345699 12345700 12345701 12345702 12345703 12345704 12345705 12345706 12345707 12345708 12345709 12345710 12345711 12345712 12345713 12345714 12345715 12345716 12345717 12345718 12345719 12345720 12345721 12345722 12345723 12345724 12345725 12345726 efbeadde

 

没学过几天C语言的我都能做出,相信优秀的你们一定也没问题!!!!

再见,安全项目QWQ

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/221295.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

银行测试:第三方支付平台业务流,功能/性能/安全测试方法

1、第三方支付平台的功能和结构特点 在信用方面&#xff0c;第三方支付平台作为中介&#xff0c;在网上交易的商家和消费者之间作一个信用的中转&#xff0c;通过改造支付流程来约束双方的行为&#xff0c;从而在一定程度上缓解彼此对双方信用的猜疑&#xff0c;增加对网上购物…

命令行方式使用abator.jar生成ibatis相关代码和sql语句xml文件

最近接手一个老项目&#xff0c;使用的是数据库是sql server 2008&#xff0c;框架是springmvc spring ibatis&#xff0c;老项目是使用abator插件生成的相关代码&#xff0c;现在需要增加新功能&#xff0c;要添加几张新表&#xff0c;可是目前网上下载的abator插件&#xf…

FPGA 实现 LeNet-5 卷积神经网络 数字识别,提供工程源码和技术支持

目录 1、前言LeNet-5简洁基于Zynq7020 的设计说明PL 端 FPGA 逻辑设计PS 端 SDK 软件设计免责声明 2、相关方案推荐卷积神经网络解决方案FPGA图像处理方案 3、详细设计方案PL端&#xff1a;ov7725摄像头及图像采集PL端&#xff1a;图像预处理PL端&#xff1a;Xilinx推荐的图像缓…

Webpack安装及使用

win系统 全局安装Webpack及使用 前提&#xff1a;使用Webpack必须安装node环境&#xff0c;建议使用nvm管理node版本。 1&#xff1a;查看自己电脑是否安装了node 2&#xff1a;npm install webpack版本号 -g 3&#xff1a;npm install webpack-cli -g -g:表示全局安装 4&…

ROS学习笔记(七)---参数服务器

ROS学习笔记文章目录 01. ROS学习笔记(一)—Linux安装VScode 02. ROS学习笔记(二)—使用 VScode 开发 ROS 的Python程序&#xff08;简例&#xff09; 03. ROS学习笔记(三)—好用的终端Terminator 04. ROS学习笔记(四)—使用 VScode 启动launch文件运行多个节点 05. ROS学习笔…

LabVIEW在燃气轮机发电机组励磁控制系统测试中的应用

LabVIEW在燃气轮机发电机组励磁控制系统测试中的应用 燃气轮机发电机组作为一种高效可靠的常备应急电源&#xff0c;在保障发电品质稳定性和可靠性方面发挥着关键作用。其中&#xff0c;励磁控制系统是保证供电质量的重要环节&#xff0c;对发电机组的稳定运行至关重要。为了有…

面向 NLP 任务的大模型 Prompt 设计

很久之前&#xff0c;我们介绍到&#xff0c;prompt是影响下游任务的关键所在&#xff0c;当我们在应用chatgpt进行nlp任务落地时&#xff0c;如何选择合适的prompt&#xff0c;对于SFT以及推理环节尤为重要。 不过&#xff0c;硬想不是办法&#xff0c;我们可以充分参考开源的…

gitlab ci pages

参考文章 gitlab pages是什么 一个可以利用gitlab的域名和项目部署自己静态网站的机制 开启 到gitlab的如下页面 通过gitlab.ci部署项目的静态网站 # build ruby 1/3: # stage: build # script: # - echo "ruby1"# build ruby 2/3: # stage: build …

linux 驱动——杂项设备驱动

杂项设备驱动 在 linux 中&#xff0c;将无法归类的设备定义为杂项设备。 相对于字符设备来说&#xff0c;杂项设备的主设备号固定为 10&#xff0c;而字符设备不管是动态分配还是静态分配设备号&#xff0c;都会消耗一个主设备号&#xff0c;比较浪费主设备号。 杂项设备会自…

大数据分析22、23真题回忆

2022 学长描述 1. 一个很简单的据估计 2. 算一个决策树 3. Cypher图 4.Hadoop和Spark的区别 2023 真题回忆 1. 大数据分析的定义 说出大数据分析三个层次 2.大数据分析流程 预处理部分包含哪几个步骤 3.Spark核心部件和应用库有哪些 并简要说明功能 4. 主成分分析和因…

MyBatis的配置文件(.properties,typeAliases,Mappers)

目录 一&#xff0c;.properties标签 二&#xff0c;typeAliases标签 三&#xff0c;Mappers标签 一&#xff0c;.properties标签 我们一般会把数据库配置信息定义在一个独立的配置文件里面&#xff0c;比如db.properties&#xff1a; jdbc.drivercom.mysql.jdbc.Driver jd…

2023中国品牌节金谱奖荣誉发布 酷开科技获颁OTT行业科技创新奖

11月17日—19日&#xff0c;以“复苏与腾飞”为主题的2023第十七届中国品牌节&#xff0c;在杭州市云栖小镇国际会展中心成功举行。在18日晚间的荣耀盛典上&#xff0c;“TopBrand 2023中国品牌节金谱奖”荣誉发布&#xff0c;酷开科技斩获OTT行业科技创新奖。 酷开科技作为OTT…

类和对象(中篇)

类的六个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 默认成员函数&#xff1a; 用户没有显式实现&#xff0c;编译器会…

TransXNet实战:使用 TransXNet实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

Java发起SOAP请求代码参考

目录 Java发起SOAP请求代码参考 代码1.组装参数2.加密参数3.发起连接4.解析返回数据 参考 文章所属专区 超链接 代码 1.组装参数 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans&qu…

HarmonyOS引导页登陆页以及tabbar的代码说明1

效果 以下代码是东拼西凑出来的。只是为了个人熟悉一下相关模块的使用&#xff1a; 用的知识点&#xff1a; Resouces 此部分分内容可以在项目中找到&#xff1a; resources/base/element/color.json 为项目着色配置&#xff0c;当然也可以正接在代码里写 float.json 为相关…

linux之Samba服务器

环境&#xff1a;虚拟机CENTOS 7和 测试机相通 一、Samba服务器_光盘共享&#xff08;匿名访问&#xff09; 1.在虚拟机CENTOS 7安装smb服务&#xff0c;并在防火墙上允许samba流量通过 2. 挂载光盘 3.修改smb.conf配置文件&#xff0c;实现光盘匿名共享 4. 启动smb服务 5.在…

快速解决msvcr100.dll丢失的方法分享,亲测有效的5个方法

在计算机使用过程中&#xff0c;我们可能会遇到各种问题&#xff0c;其中之一就是某些程序无法正常运行&#xff0c;提示“msvcr100.dll丢失”的错误信息。msvcr100.dll是Microsoft Visual C 2010运行库的一部分&#xff0c;它提供了许多常用的函数和类&#xff0c;这些函数和类…

LVS负载均衡器(DR模式)+nginx七层代理+tomcat多实例+php+mysql 实现负载均衡以及动静分离、数据库的调用!!!

目录 前言 一、nfs共享存储&#xff0c;为两个节点服务器提供静态网页共享 二、nginx作为lvs的后端节点服务器&#xff0c;完成lo:0网卡配置&#xff0c;以及内核参数设置&#xff0c;还有设置路由表 步骤一&#xff1a;先完成nfs共享存储挂载 步骤二&#xff1a;完成lo:0网…