当前位置: 首页 > news >正文

BUUCTF PWN wp--pwn1_sctf_2016

第一步 checksec,并检查该题的保护机制,32位

  1. Arch: i386-32-little
    • 这表示程序的架构是32位的i386(即x86),并且使用小端序(little-endian)存储方式。这意味着程序是为32位系统设计的。
  2. RELRO: Partial RELRO
    • RELRO(Relocation Read-Only)是一种安全特性,用于减少对全局偏移表(GOT)的攻击。Partial RELRO表示只对部分GOT表进行了保护。如果采用完全RELRO,则GOT表在程序启动时就变成只读,从而提高安全性。Partial RELRO的保护级别低于完全RELRO。
  3. Stack: No canary found
    • 栈保护(Stack Protection)通常通过在栈中插入一个随机值(称为“canary”)来实现。如果发生栈溢出,canary值会被修改,程序可以检测到这种修改并终止执行,从而防止攻击。这里显示“No canary found”,意味着程序没有使用栈保护,这使得它更容易受到栈溢出攻击。
  4. NX: NX enabled
    • NX(No-eXecute)是一种安全特性,用于防止在栈或堆上的数据被执行。这里显示“NX enabled”,意味着程序启用了NX保护,这可以有效地防止某些类型的缓冲区溢出攻击。
  5. PIE: No PIE (0x8048000)
    • PIE(Position Independent Executable)是一种安全特性,使得程序的代码可以在内存中的任意位置加载,每次加载的位置都可能不同。这样可以增加攻击者预测内存地址的难度。这里显示“No PIE”,意味着程序没有使用PIE,其代码在内存中的位置是固定的(此处为0x8048000),这使得它更容易受到攻击。

第二步    进入主函数,发现只有一个vuln函数,跟进

跟进后如下

下面详细分析一下:

  1. printf("Tell me something about yourself: ");
    这行代码向用户输出提示信息,要求用户输入一些内容。
  2. fgets(s, 32, edata);
    fgets函数从edata流中读取最多31个字符到s中(加上一个终止符\0,总共32个字符)。这通常用于从标准输入读取用户输入。
  3. std::string::operator=(&input, s);
    这一行代码将字符串s赋值给一个std::string对象input。operator=是std::string类的赋值运算符,将C风格的字符串char*转化为C++风格的std::string。
  4. std::allocator<char>::allocator(&v5);
    这行代码创建了一个std::allocator<char>对象v5,它是C++标准库中用于管理内存分配的工具。
  5. std::string::string(v4, "you", &v5);
    这行代码使用分配器v5创建了一个包含字符串"you"的std::string对象v4。
  6. std::allocator<char>::allocator(v7);
    这行代码创建了另一个std::allocator<char>对象v7。
  7. std::string::string(v6, "I", v7);
    这行代码使用分配器v7创建了一个包含字符串"I"的std::string对象v6。
  8. replace((std::string *)v3);
    这行代码表示一个字符串替换操作,可能是在v3指向的字符串中将某个子串替换为另一个子串。
  9. std::string::operator=(&input, v3, v6, v4);
    这行代码表示可能是在字符串input中,将子字符串v4替换为v6。如果v4是"you",v6是"I",则这可能是将字符串中的"you"替换为"I"。(我们输入的其它字符只占一个字节,而我们输入的“I”经过replace函数后会变成“you”也就是放大了三倍,我们的输入只有31个字节,而我们需要64位的填充数据
  10. std::string::~string(v3);
    销毁v3指向的std::string对象,释放其占用的资源。
  11. std::string::~string(v6);
    销毁v6指向的std::string对象,释放其占用的资源。
  12. std::allocator<char>::~allocator(v7);
    销毁v7对象,释放内存分配器所管理的资源。
  13. std::string::~string(v4);
    销毁v4指向的std::string对象,释放其占用的资源。
  14. std::allocator<char>::~allocator(&v5);
    销毁v5对象,释放内存分配器所管理的资源。
  15. v0 = (const char *)std::string::c_str((std::string *)&input);
    将input对象的内容转换为C风格字符串指针v0。
  16. strcpy(s, v0);
    将v0指向的字符串复制到s中。
  17. return printf("So, %s\n", s);
    最后输出字符串s的内容,并返回printf的返回值。

第三步  我们进入一下与flag有关的get_flag函数

该函数的地址是0x8048F0D

计算填充数据,跟进数组s

两个s之间的距离为0x3c即60,因为前面的替换操作  I(一个字节)=you(三个字节)

而fgets限制为32个,60个字节刚好可以用20个I填满, db 4 dup(?) 这里还有4个字节内存要被占!!所以一共为20+4个(上面提到的64个填充数据=20*3+4)

第四步  编写脚本

第五步  运行

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 区块链的搭建与运维4
  • 【数据库】MySQL表的约束
  • QT-贪吃蛇小游戏
  • 【自动化】一共获取6600多公司信息【逆向】一页15还加密。
  • S7通信协议从入门到精通_1_Sharp7(C#)类编写西门子 S7系列 plc驱动程序(扩展C++语言)
  • springCloud 网关(gateway)配置跨域访问
  • MyBatis中的#{}和${}区别、ResultMap使用、MyBatis常用注解方式、MyBatis动态SQL
  • spark全面个人总结(20个面试点)非网文 持续更新中
  • C语言 ——— 常见的动态内存错误(上篇)
  • Parallels Desktop 19 for Mac 安装虚拟机需要激活吗
  • 在不训练模型的情况下强化语言模型
  • 在idea中的git选择某一次记录拉出一个新分支
  • 软考:软件设计师 — 15.数据结构及算法应用
  • 企业级NoSql数据库Redis集群
  • Go 语言切片(Slice)
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • CentOS 7 防火墙操作
  • JAVA SE 6 GC调优笔记
  • Java 最常见的 200+ 面试题:面试必备
  • javascript数组去重/查找/插入/删除
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • Promise面试题2实现异步串行执行
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • redis学习笔记(三):列表、集合、有序集合
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 初识MongoDB分片
  • 构建二叉树进行数值数组的去重及优化
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 06-01 点餐小程序前台界面搭建
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • ​经​纬​恒​润​二​面​​三​七​互​娱​一​面​​元​象​二​面​
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • ​香农与信息论三大定律
  • (1)Jupyter Notebook 下载及安装
  • (Python第六天)文件处理
  • (阿里云万网)-域名注册购买实名流程
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (六)DockerCompose安装与配置
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • ../depcomp: line 571: exec: g++: not found
  • .NET开源纪元:穿越封闭的迷雾,拥抱开放的星辰
  • .net流程开发平台的一些难点(1)
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually
  • @RequestBody与@RequestParam:Spring MVC中的参数接收差异解析
  • [《百万宝贝》观后]To be or not to be?
  • [20171101]rman to destination.txt
  • [BUG]vscode插件live server无法自动打开浏览器
  • [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)
  • [C#]winform部署官方yolov10目标检测的onnx模型
  • [C++] 默认构造函数、参数化构造函数、拷贝构造函数、移动构造函数及其使用案例
  • [c++] 什么是平凡类型,标准布局类型,POD类型,聚合体
  • [C++]priority_queue的介绍及模拟实现
  • [CISCN2019 华东南赛区]Web4
  • [Deepin] 简单使用 RustDesk 实现远程访问Deepin