详细ciscn_2019_s_3题解

2024-02-10 04:20
文章标签 详细 2019 题解 ciscn

本文主要是介绍详细ciscn_2019_s_3题解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

来了来了,我拖了好久,因为吧,之前做了个堆题,大概用了一周才做完,做完堆题,下一个题是栈的,我以为会很简单,但是对我来说很难诶。上才艺…
(系统调用其他师傅都有写,我就不赘述啦啦啦啦啦),因为师傅们翻到我这里肯定对系统调用有了解了呀,我这么菜,只能在最下边呜呜呜。
1.拖入ida,反汇编(64位),注意到函数传参与32位会不同。在这里插入图片描述
在函数框内发现vuln(大家应该对这种函数很熟悉了吧),还有gadgets函数,奇怪,正常的栈不会有这种东西啊,于是我就点进去看了看,在这里插入图片描述看到了这两个像rax进行传参的汇编,这就为我们后来做系统调用做了铺垫吧(当时怎么没想到,当时一直想的是普通的ret2libc,可是在函数表里没有read和write的plt和got,无法进行泄露)
2.因为程序开了地址随机化,所以每次载入内存的地址都不相同,但是read函数会向buf读入0x10的数据,write会将buf中的0x30数据输出,但是buf大小只有0x10,还有0x20的多余,那么write首先会将buf内容打印出来,然后再泄露比buf地址高处的内容。看图在这里插入图片描述buf输出完后,再从ret这个地址处输出0x20的数据大小,那就gdb调试一下看看栈上有何内容吧在这里插入图片描述aaaaaaaa的位置在0x7fffffffde60,去查看这个内存地址附近的内存,write能从地址0x7fffffffde60输出到地址0x7fffffffde80,这里边的内容,发现有疑似栈的数据0x00007fffffffdf78(好像说是栈的地址,0x00007fffffffdf78与刚开始rsi内存的数据相同,所以是栈的基地址),因为开启了保护,所以每次栈的内存都不同,但是栈内的偏移是相同的呀,利用bin_sh_addr = 栈的基地址 - 0x118。那我们利用read向栈上写/bin/sh字符串,再用write进行泄露/bin/sh的地址。
也就是说,因为write打印的话,是先从栈的低地址打印,再打印高地址的内容,那么先打印0x20的数据,再打印0x8的数据就是栈的基地址,再减去0x118就获得 /bin/sh的地址喽
3.获得了取得/bin/sh地址的方法,那么我们怎么利用呢?

1.构建payload1 = b"/bin/sh\x00"+p64(0)+p64(vuln) 让程序再返回vuln函数(这里要加隔断符是因为程序是64位的,要满足8字节对齐,/bin/sh是七个字节。)·然后接受write打印的前0x20个无用数据,再接受栈基地址数据,最后根据前边调试出来的公式得到我们写入的/bin/sh地址

构造payload2之前,先声明一下pop_addr = 0x40059a,mov_addr = 0x400580,mov_rax = 0x4004e2

2.payload2 = b"/bin/sh\x00"*2+p64(pop_addr)+p64(0)*2+p64(bin_sh_addr + 0x50)+p64(0)*3+p64(mov_addr)+p64(mov_rax)+p64(pop_rdi)+p64(bin_sh_addr)+p64(syscall)
我们来一步一步解析,因为又回到了vuln函数内,首先就有溢出,填充/bin/sh\x00,然后可以得到他的地址。
再对rbx,rbp,r12,r13,r14,r15赋值,再去执行给rdx,rdi赋为0,执行call [r12],这个函数是执行,r12寄存器中存储的地址的函数(因为rbx等于0嘛),r12内存的是bin_sh_addr+0x50这个地址,这个地址存放的是mov_rax(这里我卡了一天才弄懂,我来个图吧直接,铁子们)
在这里插入图片描述够清晰了叭,bin_sh_addr+0x50其实指向的就是mov_rax,因为mov_addr附近没有ret指令,也就没有办法给rax赋值为3bh喽。(其实吧,0x50位置处不是mov_rax也行,可以是pop_rdi,因为两者执行完主体之后,都会有ret,可以shi6rop继续执行下去。)

payload
在这里插入图片描述
以下与题无关,仅提醒自己
这里在最后提醒一下自己:
p32/p64: 打包一个整数,分别打包为32位或64位
u32/u64:解包一个字符串,得到整数
encode:str->byte
decode:byte->str
平常io.recv()得到的都是字符串,io.send()送去的是字符串。

这篇关于详细ciscn_2019_s_3题解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/696121

相关文章

Python设置Cookie永不超时的详细指南

《Python设置Cookie永不超时的详细指南》Cookie是一种存储在用户浏览器中的小型数据片段,用于记录用户的登录状态、偏好设置等信息,下面小编就来和大家详细讲讲Python如何设置Cookie... 目录一、Cookie的作用与重要性二、Cookie过期的原因三、实现Cookie永不超时的方法(一)

SpringBoot整合liteflow的详细过程

《SpringBoot整合liteflow的详细过程》:本文主要介绍SpringBoot整合liteflow的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋...  liteflow 是什么? 能做什么?总之一句话:能帮你规范写代码逻辑 ,编排并解耦业务逻辑,代码

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机

HTML img标签和超链接标签详细介绍

《HTMLimg标签和超链接标签详细介绍》:本文主要介绍了HTML中img标签的使用,包括src属性(指定图片路径)、相对/绝对路径区别、alt替代文本、title提示、宽高控制及边框设置等,详细内容请阅读本文,希望能对你有所帮助... 目录img 标签src 属性alt 属性title 属性width/h

CSS3打造的现代交互式登录界面详细实现过程

《CSS3打造的现代交互式登录界面详细实现过程》本文介绍CSS3和jQuery在登录界面设计中的应用,涵盖动画、选择器、自定义字体及盒模型技术,提升界面美观与交互性,同时优化性能和可访问性,感兴趣的朋... 目录1. css3用户登录界面设计概述1.1 用户界面设计的重要性1.2 CSS3的新特性与优势1.

CSS中的Static、Relative、Absolute、Fixed、Sticky的应用与详细对比

《CSS中的Static、Relative、Absolute、Fixed、Sticky的应用与详细对比》CSS中的position属性用于控制元素的定位方式,不同的定位方式会影响元素在页面中的布... css 中的 position 属性用于控制元素的定位方式,不同的定位方式会影响元素在页面中的布局和层叠关

在Windows上使用qemu安装ubuntu24.04服务器的详细指南

《在Windows上使用qemu安装ubuntu24.04服务器的详细指南》本文介绍了在Windows上使用QEMU安装Ubuntu24.04的全流程:安装QEMU、准备ISO镜像、创建虚拟磁盘、配置... 目录1. 安装QEMU环境2. 准备Ubuntu 24.04镜像3. 启动QEMU安装Ubuntu4

SpringBoot整合Flowable实现工作流的详细流程

《SpringBoot整合Flowable实现工作流的详细流程》Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable流程引擎可用于部署BPMN2.0流程定义,创建这些流程定义的... 目录1、流程引擎介绍2、创建项目3、画流程图4、开发接口4.1 Java 类梳理4.2 查看流程图4

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w

Python UV安装、升级、卸载详细步骤记录

《PythonUV安装、升级、卸载详细步骤记录》:本文主要介绍PythonUV安装、升级、卸载的详细步骤,uv是Astral推出的下一代Python包与项目管理器,主打单一可执行文件、极致性能... 目录安装检查升级设置自动补全卸载UV 命令总结 官方文档详见:https://docs.astral.sh/