Stack Smashing

news/2024/5/4 0:01:52/文章来源:https://www.cnblogs.com/m1nus/p/16733131.html

Stack Smashing

当canary被覆盖后,会call到__stack_chk_fail打印argv[0]这个指针指向的字符串,默认是程序的名字,如果我们把它覆盖为其他的地址时,它就会把其他内存地址的信息给打印出来

Example:wdb2018_guess

Analyze

Arch:     amd64-64-little
RELRO:    Partial RELRO
Stack:    Canary found
NX:       NX enabled
PIE:      No PIE (0x400000)
This is GUESS FLAG CHALLENGE!
Please type your guessing flag
123
You should take more effort to get six sence, and one more challenge!!
Please type your guessing flag

以上是程序开启的一些保护和大概的流程

main
__int64 __fastcall main(__int64 a1, char **a2, char **a3)
{__WAIT_STATUS stat_loc; // [rsp+14h] [rbp-8Ch] BYREF__int64 v6; // [rsp+20h] [rbp-80h]__int64 v7; // [rsp+28h] [rbp-78h]char buf[48]; // [rsp+30h] [rbp-70h] BYREFchar s2[56]; // [rsp+60h] [rbp-40h] BYREFunsigned __int64 v10; // [rsp+98h] [rbp-8h]v10 = __readfsqword(0x28u);v7 = 3LL;LODWORD(stat_loc.__uptr) = 0;v6 = 0LL;sub_4009A6(a1, a2, a3);HIDWORD(stat_loc.__iptr) = open("./flag.txt", 0);if ( HIDWORD(stat_loc.__iptr) == -1 ){perror("./flag.txt");_exit(-1);}read(SHIDWORD(stat_loc.__iptr), buf, 0x30uLL);close(SHIDWORD(stat_loc.__iptr));puts("This is GUESS FLAG CHALLENGE!");while ( 1 ){if ( v6 >= v7 ){puts("you have no sense... bye :-) ");return 0LL;}if ( !(unsigned int)sub_400A11() )break;++v6;wait((__WAIT_STATUS)&stat_loc);}puts("Please type your guessing flag");gets(s2);if ( !strcmp(buf, s2) )puts("You must have great six sense!!!! :-o ");elseputs("You should take more effort to get six sence, and one more challenge!!");return 0LL;
}

可以看到通过gets来接收变量s2,也就是用户输入,然后与buf(即flag)进行compare,如果相同则输出""You must have great six sense!!!! 😮 "

否则让用户继续进行输入

虽然是危险函数gets,但是由于本题开启了canary保护,所以没法进行stackoverflow或者搭配ROP等攻击

这里的话我们利用stack smashing来泄露程序的内存信息

Principle

前言已经提到过,当canary被覆盖后,会调用__stack_chk_fail这个函数,打印argv[0]这个指针指向的字符串,默认为程序的名字,stacksmashing的思想就是通过覆盖argv[0]这个指针指向的地址,让程序在调用__stack_chk_fail的时候,输出我们想要的内容,比如可以通过覆盖argv[0]为puts的got表地址,从而让程序打印出puts函数的真实地址,来泄露libc

Structure attack script

首先我们需要动调找到argv[0]这个指针距离用户输入的偏移,__libc_argv[0]里面存储的是程序的名字,找到指向__libc_argv[0]的指针即可,计算这个指针和指向用户输入的内容的指针的偏移

这里的话,16.04环境下偏移是0x128,然后就可以往这个地址去覆盖想要泄露的函数地址了,比如这里我们泄露puts函数地址

payload1 = b'a' * 0x128 + p64(puts_got)

输出的地方如图所示,接收了puts地址后就可以拿到libc基址了

接着就涉及到如何通过libc地址来得到栈地址这个知识点了

Obtain the stack address through libc address

在libc中保存了一个函数叫_environ,存的是当前进程的环境变量,我们可以通过_environ函数来得到环境变量地址,而环境变量是存在栈上的,然后我们通过偏移就可以计算得到其他函数的地址了

首先得到_environ函数地址

environ_addr = libc_base + libc.sym['__environ']

然后用_environ函数地址覆盖__libc_argv[0]指针地址,让程序通过__stack_chk_fail报错输出_environ环境变量地址

payload2 = b'a' * 0x128 + p64(environ_addr)

这样就拿到环境变量地址了,下一步就是去找存flag的变量地址和环境变量地址的偏移

gdb下可以通过x/a _environ来查看环境变量地址,通过search flag来查找flag变量地址,相减得到偏移

16.04下偏移为0x168

最后一步将__libc_argv[0]覆盖成flag的地址即可,通过__stack_chk_fail来输出flag值

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

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

相关文章

3个超实用功能,华为手机负一屏应该这么用

现在越来越多人使用华为手机,但是你知道华为手机的负一屏吗?华为手机负一屏有哪些功能?华为手机的负一屏有以下3个超实用的功能,以后打开手机,你就可以快速找到自己想查看的东西了! 你可能会问华为手机的负…

C语言刷题(二)

✅作者简介:大家好我是:嵌入式基地,是一名嵌入式工程师,希望一起努力,一起进步! 📃个人主页:嵌入式基地 🔥系列专栏:牛客网C语言刷题专栏 💬推荐一…

保姆级, 使用 KotlinScript 构建 SpringBootStarter

因业务需要, 公司内需要使用 SpringBoot Starter 构建 SDK. 不同的是使用了更为灵活的 Kotlin 语言, 构建脚本也换成了 Kotlin Script. .kts本文主要分几个步骤: 用 Kotlin 写一个简单 SpringBoot Starter 进阶一: 复杂配置参数的写法 进阶二: starter 单元测试 使用 Kotlin …

【计算机组成原理】中央处理器(四)—— 控制器的功能和工作原理

【计算机组成原理】中央处理器(四)—— 控制器的功能和工作原理一、前言二、硬布线控制器(一)、安排微操作时序的原则1. 安排微操作时序-取指周期2. 安排微操作时序-间址周期3. 安排微操作时序-执行周期4. 安排微操作时序-间址周期…

Python算法性能分析-时间复杂度

时间复杂度: 算法的运行时间。 什么是大O: 大O用来表示上界的。 数据规模: 在决定使用哪些算法的时候,不是时间复杂越低的越好(因为简化后的时间复杂度忽略了常数项等等),要考虑数据规模&am…

没有项目经验,如何书写漂亮的简历?

嗨,同学 你们是不是也开始 国庆假期倒计时啦!!! 一想到熬过这周,接下来可以嗨7天7夜 就按捺不住自己内心的雀跃! 但是,有人却高兴不起来,因为在这个“金九银十”,一些同学还没找到…

接口(关注我还有后续哦)

👍 棒棒有言:现在学习Java变得比以前容易多了,除了有大量的视频教程外,还有专业的机构,这都使学习变得更加简单化。如果仅仅学了些皮毛,高手写的程序你是望尘莫及的。在学习的过程中,书籍永远是…

后台系统接入udesk在线客服(vue前端方式)

SDK最舒服的一点就是买来服务,直接Ctrl CV脚本进项目基本就能完成目标功能,要做的无非就是自定义属性的添加。 楼上项目组用的是java后端接入,我这儿是vue前端接入,做法略有不同。 简单点做就是复制上面script标签内代码到index.h…

关于SignalR的内容延续:1.协商协议 2.分布式部署

既然项目中用到了,那就搞搞清楚,搞不懂就死 : > 前置内容: 长轮询问题在ABP中的解决方案,SignalR_董厂长的博客-CSDN博客 “SingalR是对webSocekt的封装” ,这句话是片面的。 因为: SignalR支持多…

vue-----组件通信/传值

一 父子组件通信分为父给子传和子给父传 父给子传: 1.在子组件标签中写传入的值 2.在子组件内使用props接收父组件传递的值。 子给父传: 1.在子组件内部使用$emit发射自定义事件和传递给父组件的值 2.在父组件内声明自定义事件接受参数 二 兄弟组件…

真无线蓝牙耳机哪款音质最好?真无线蓝牙耳机音质排行榜

随着蓝牙技术的飞速发展,很多耳机的质量和质量都很好。喜欢音乐的人,往往会沉迷于这种美妙的感觉,也正是因为如此,他们才会对音质有更高的要求。除了音质之外,还有很多新的特性,例如主动降低噪音、声音操控…

全流程调度

目录 Azkaban 配置mysql 配置 Executor Server 配置Web Server Sqoop导出脚本 Azkaban 安装azkaban并改名 配置mysql 启动 [doudouhadoop102 ~]$ mysql -uroot -p123456登陆 MySQL,创建 Azkaban 数据库 mysql> create database azkaban;设置密码有效长度 …

一文入门Qt Quick

很高兴可以来到这一章,终于可以开始讲讲最近几年Qt的热门技术Quick这一块了。希望通过这个比较简短的例子可以带领有兴趣的朋友快速跨过Qt Quick的入门这道槛!以下内容为本人的著作,如需要转载,请声明原文链接 微信公众号「englyf」https://www.cnblogs.com/englyf/p/16733…

m基于matlab的光通信的信道估计,均衡,抑制papr误码率仿真,对比ZF,RLS,MMSE三种算法(包括matlab仿真录像)

目录 1.源码获取方式 2.算法描述 3.部分程序 4.部分仿真图预览 1.源码获取方式 使用版本matlab2013b 获取方式1: 点击下载链接(解压密码C123456): m基于matlab的光通信的信道估计,均衡,抑制papr误码…

libxml编译时问题解决记录

在对libxml进行模糊测试时,需要先将其拉去并进行编译,可参考此链接:magma本地编译 或者直接参考这个链接:magma编译libxml2 然而在编译的过程中,拉去完libxml2执行到这一句时报错如下: configure.ac:42: e…

Python骚操作,实现驾考自动答题,这就直接满分了?

Python骚操作来了~ 用Python来实现科目一/四自动答题,100分不要太简单! 最初是表弟最近想买车,但是驾照都没有,买什么车,只能先考驾照~ 看他在网页上练习题目慢吞吞的,我就看不下去了,直接给他…

《数据结构》队列及其经典面试题

前言 上一篇讲了栈和栈的经典面试题,链接如下: 栈与栈的经典面试题 其实栈和队列是一码事,都是对只能再线性表的一端进行插入和删除。 因此,其实栈和队列可以互相转换! 一、队列的特点 先进先出的数据结构&#…

Android系统安全 — 2.0-移动终端栈溢出的保护机制设置

简介 操作系统提供了许多安全机制来尝试降低或阻止缓冲区溢出攻击带来的安全风险。例如 NX/DEP、 ASLR(PIE)、CANARY、FORTIFY、RELRO 等手段。 栈保护 1.NX/DEP Linux 和 Windows 平台都支持对非可执行代码的保护,在 Linux 平台中被称为…

【Mybatis框架】初识Mybatis

CSDN话题挑战赛第2期 参赛话题:学习笔记 MyBatis1、MyBatis简介1.1、MyBatis历史1.2、MyBatis特性2. 搭建MyBatis2.1 创建一个Maven项目2.2 在项目下新建我们的MyBatis项目2.3 引入依赖2.4 创建MyBatis的核心配置文件2.5 创建mapper接口2.6 创建MyBatis的映射文件2.…

AWS 中文入门开发教学 34- MySQL@RDS - 准备工作 - VPC子网,安全组,DB子网组,参数组,选项组

知识点 建立RDS MySQL前的准备工作实战演习 VPC子网,安全组,DB子网组,参数组,选项组 VPC子网 Name: deeplearnaws-db-1cCIDR: 172.16.21.0/24 安全组 Name: deeplearnaws-db-sg <- 可以直接使用之前创建的,但生产环境时应只保留3306端口 DB子网组 Name: deeplearnaws-db-su…