【PWN】学习笔记(一)【二进制基础】

目录

  • 课程教学
  • 一次简单的Hack
  • 程序的编译与链接
  • Linux下的可执行文件格式ELF
  • 进程虚拟地址空间
  • 程序的编译与链接
  • 程序的装载与进程的执行
  • x86&amd64汇编简述

课程教学

课程链接:https://www.bilibili.com/video/BV1854y1y7Ro/?vd_source=7b06bd7a9dd90c45c5c9c44d12e7b4e6
课程附件: https://pan.baidu.com/s/1vRCd4bMkqnqqY1nT2uhSYw 提取码: 5rx6

一次简单的Hack

Linux 二进制文件ELF
在这里插入图片描述

windows 二进制文件exe
在这里插入图片描述

比赛方在某个服务器(106.54.129.202)的某个端口(10002)挂上一个二进制服务(ret2libc3);比赛旨在找二进制程序中的漏洞,找到后远程运行相同的程序,对远程的端口发起攻击,攻击成功后获得shell,进而控制远程服务器进而拿到flag
在这里插入图片描述
执行这个二进制文件,随意输入导致程序崩溃
在这里插入图片描述
在比赛中连接远程服务器也会获得相应的结果(这里没开了所以没有结果)
在这里插入图片描述
第一步:全面了解程序
利用file 了解其格式(32位linux下的可执行文件)
在这里插入图片描述
第二步:利用IDA进而分析程序
在这里插入图片描述
F5转汇编代码
在这里插入图片描述
值得注意的是,这里是反编译的C语言源代码,并不一定是程序编写者所编写的源代码,但是功能是相同的。

第三步:在C语言代码中找漏洞
在以下代码中有两个漏洞(1)内存泄露【红色箭头】以及(2)栈溢出【紫色箭头】
在这里插入图片描述
在这里插入图片描述
第四步:根据漏洞编写漏洞利用程序exp.py

在这里插入图片描述
显然我们连接不了,需要改代码
在这里插入图片描述
修改为本地处理
在这里插入图片描述
但是仍然有问题,程序并没有交互而是终止了
在这里插入图片描述
在教程中拿到shell是可以正常交互的,获得flag,这个问题后续再解决
在这里插入图片描述
构造恶意数据发送给服务器,导致程序控制流被劫持(以下为payload,一段字节流(在网络IO里发送的总是字节流,字符串对象需要编译成字节流))
在这里插入图片描述
shell是什么?

Shell是Linux/Unix的一个外壳,你理解成衣服也行。它负责外界与Linux内核的交互,接收用户或其他应用程序的命令,然后把这些命令转化成内核能理解的语言,传给内核,内核是真正干活的,干完之后再把结果返回用户或应用程序。

一个终端可运行多个shell(提供用户与操作系统交互的命令行接口【文本接口】)
平常用windows与操作系统交互用的是GUI图形化用户接口,但是linux不同;shell与GUI是不同的(提供给用户的与操作系统交互的接口)

父进程开启子进程,子进程退出回到父进程
在这里插入图片描述

程序的编译与链接

一切编译型语言都可生成二进制程序(php基于C语言,很多问题都是由于C语言导致的)
为什么C/C++占比高?其他语言及时性不高,容易拥塞(存在垃圾搜集器)

在这里插入图片描述

linux不同于windows,其中的文件都是借助程序头来分辨的,后者是通过后缀名(容易被对手欺骗,例如将txt改成zip,文件内容不变但是操作系统会认错)
linux 可通过file来辨认,即使改变后缀名也能认出来

你能操作的程序都是载入内存的,在磁盘则无法交互

在这里插入图片描述

:%!xxd (在vim中输入,将代码转成十六进制)
左边是偏移量,距离文件头的距离
:%!xxd -r(还原)
在这里插入图片描述
gcc test.c 编译为可执行文件(a.out) ./a.out执行这个文件
gcc -S test.c 编译为汇编文件(test.s)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
仍然是文本文件,还是可用gcc test.s变为可执行文件
在这里插入图片描述
在这里插入图片描述
乱码的原因是只有特定范围的值可表示为字符,一字节0到256,10到127对应asc码符号,其他都很难看出来。
在这里插入图片描述
转成二进制(十六进制),可看到机械码,CPU只认识01。

a.o不知道函数在哪,a.out知道(因为建立了链接)【上面的步骤省略了】
在这里插入图片描述

Linux下的可执行文件格式ELF

在这里插入图片描述
在这里插入图片描述
python也是广义上的可执行文件,用ll可查看其详细信息,这里是不具备执行的权限的
在这里插入图片描述

将其输入python3的解释器使其运行

在这里插入图片描述
可在文件头写入解释器再来执行
在这里插入图片描述
这里是权限不够,即使用sudo也不行,这不是用户权限不够而是文件权限不够
在这里插入图片描述

通过chmod +x 为其添加可执行权限
在这里插入图片描述
在这里插入图片描述
段表是用于表示不同进程映像不同部分的权限的(代码段不可写,数据段可写)
节头表是用来组织ELF文件存储在磁盘上各个节的信息
在这里插入图片描述
断电内存的信息就保存不了了,磁盘中的文件是可保存的
在这里插入图片描述
程序执行不仅限于程序本体,还有各种控制结构,程序本体只占一小部分
objdump -s elf
在这里插入图片描述
vmmap
在这里插入图片描述

进程虚拟地址空间

在这里插入图片描述
早期计算机在实模式下的,物理内存条上运行;这样容易受攻击,不同程序都是在同一个物理内存,甚至篡改操作系统。

保护模式(地址不是物理地址,操作系统给的虚拟内存地址);用户无法拿到物理地址;计算机硬件不可由用户直接访问,存在很多隐性问题;若要操纵硬件可通过系统调用接口

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
windows是2:2

CPU总线宽度,一次传输的量(32位/64位)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
glb作为未初始化的全局变量存在Bss中(不占用实际的空间,只有实际运行才会开辟内存占用,避免浪费)
str作为初始化的全局变量会先放在Data中
malloc这里动态申请100个字节的内存不用放在静态存储区,所以放在Heap中;只有在代码执行时才会动态分配;静态是提前分配好的大小
t,ptr在Stack中,局部变量存在栈中,当一个函数执行完相关的局部变量被释放,栈保存一个进程中函数的执行状态;x和y作为形参,参数传递使用,如果是32位放在栈中,如果是64位则不会放在内存,而是放在寄存器(速度最快),所以这里没有;
【重点:哪部分数据存在哪个位置】

程序的编译与链接

在这里插入图片描述
在这里插入图片描述
高位和低位的放置问题;
小端序 0x00002345 易于溢出 0x0000ffff 数据从低地址往高地址写 程序把从ffff到后续低地址的内存都识别为字符串,从识别的位置一直溢出知道看见高位的地址是00,则表示后续的都不是字符串了 【小端序直接从低地址往高地址溢出即可】
大端序 0x45230000 无法用这种方法
【大部分都是小端序的题目,高位放在高内存,低位放在低内存】
例如, 字符串"deadbeef",f存在第一个,内存加1存e,以此类推

程序的装载与进程的执行

在这里插入图片描述
地址总线:CPU告诉内存取哪块地址的内容
数据总线:内存通过数据总线把这块内容送到CPU
控制总线:传送指令
在这里插入图片描述
amd64向下兼容x86
在这里插入图片描述
一个静态链接的程序是不需要动态链接库的,它所有要实现的功能和内容都写死在相应的elf文件中;可独立工作
动态链接需要别人的代码,先标记(例如printf,到时候执行再去要【操作系统的文件库】)
fork拷贝一份,调用函数execve【动态链接库的函数】,调用系统调用sys_execve(),用户态程序向操作系统申请使用硬件,准备好后告知用户可以执行了,执行汇编代码_start来准备程序执行的环境【这里才是真正的程序入口】

在这里插入图片描述

Id.so用来管理第三方库的代码借还,相当于中介;相对于静态,动态链接需要准备的环境更多,所以有__libc_start_main()以及_init

x86&amd64汇编简述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
栈的工作原理【后进先出,读写总是在栈顶】
在这里插入图片描述
我们可以看间,栈是从高地址到低地址,但是其他的是低地址到高地址;这是因为其不知道其需要多少地址空间,这样Heap和Stack可以很好利用好所有的地址空间,不会造成浪费或者不够用
在这里插入图片描述
子函数返回时子函数的栈帧被销毁
在这里插入图片描述
在执行sum(1,2)之前需要先保存void *ptr那一行的地址,然后执行完后再把这个地址弹回去【RET的作用】
RIP不能作为被操控数
在这里插入图片描述

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

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

相关文章

C++ queue 和priority_queue

目录 1.什么是queue 2.模拟实现 3.仿函数 模板参数Compare 仿函数 4.什么是priority_queue 模拟实现 1.什么是queue 1.队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。 2.队列作为…

APP备案,最新获取安卓签名文件中MD5等信息方法

1.通过签名文件获取SHA1和SHA256 直接通过cmd执行命令 keytool -list -v -keystore xxxxx/xxx/xx/xxx.keystore输入后回车会提示输入密码库口令,直接输入Keystore密码(输入过程中终端上不会显示,输完回车就行) 2.获取md5 由于…

从线性回归到神经网络

一、线性回归关键思想 1、线性模型 2、基础优化算法 二、线性回归的从零开始实现 在了解线性回归的关键思想之后,我们可以开始通过代码来动手实现线性回归了。在这一节中,我们将从零开始实现整个方法,包括数据流水线、模型、损失函数和小批量…

js判断是否对象自身为空

文章目录 一、前言二、JSON.stringify三、for in 配合 hasOwnProperty四、Object.keys五、Object.getOwnPropertyNames六、Object.getOwnPropertyNames 结合 Object.getOwnPropertySymbols七、Reflect.ownKeys八、最后 一、前言 如何判断一个对象为空? 先上结论&a…

前端面试——CSS面经(持续更新)

1. CSS选择器及其优先级 !important > 行内样式 > id选择器 > 类/伪类/属性选择器 > 标签/伪元素选择器 > 子/后台选择器 > *通配符 2. 重排和重绘是什么?浏览器的渲染机制是什么? 重排(回流):当增加或删除dom节点&…

深入理解Dubbo-3.高级功能剖析和原理解析

👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring源码、JUC源码、Kafka原理、分布式技术原理🔥如果感觉博主的文章还不错的话&#xff…

深入理解JavaScript的箭头函数

深入理解JavaScript的箭头函数 在ES6中,JavaScript引入了箭头函数的概念,它提供了一种更简洁的语法来定义匿名函数。虽然箭头函数看起来很简单,但它们在实际应用中有一些独特的特性和行为。让我们深入理解箭头函数并学习如何正确地使用它们。…

ES6之Map对象

ES6提供了 Map数据结构。它类似于对象,也是键值对的集合。但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。 创建方法 let m new Map()console.log(m)Map的方法 1.set( ) 添加元素 接收两个参数&#xff0c…

iMazing 2.17.10官方中文版含2023最新激活许可证码

iMazing是一款iOS设备管理软件,界面简洁功能丰富,但其中还有一个界面更简洁,功能更精炼的小工具,适合轻量级的用户日常来使用,更加方便快捷。接下来,小编就来教大家如何使用iMazing MiNi,以及它…

2-2、基本数据类型

语雀原文链接 文章目录 1、数据类型分类2、基本数据类型2-1、布尔型boolean2-2、字符型char2-3、整型 byte short int long2-4、浮点型float double 3、基本类型转换byte特例char特例 1、数据类型分类 Java 语言是一种强类型语言。通俗点说就是,在 Java 中存储的数…

卡码网 46携带研究材料 LeetCode 416分割等和数组 1049最后一块石头的重量-ii | 代码随想录25期训练营day42、43

动态规划算法4 卡码网 46 携带研究材料 2023.12.6 题目链接常规二维dp数组方法代码随想录讲解[链接]一维滚动数组方法代码随想录讲解[链接] //二维dp数组做法 #include<bits/stdc.h> using namespace std;int main() {//m为材料种类数&#xff0c;n为行李箱最大空间数…

手眼标定 - 最终精度和误差优化心得

手眼标定 - 标定误差优化项 一、TCP标定误差优化1、注意标定针摆放范围2、TCP标定时的点次态与工作姿态尽可能保持相近 二、深度相机对齐矩阵误差1、手动计算对齐矩阵 三、手眼标定拍照姿态1、TCP标定姿态优先2、水平放置棋盘格优先 为减少最终手眼标定的误差&#xff0c;可做或…

首次发布亚马逊云科技生成式AI技术堆栈,re:Invent大会重磅发布

亚马逊云科技总是在不断重构&#xff0c;以推动创新&#xff0c;而今年re:Invent的主角毫无疑问是生成式AI。这从亚马逊云科技副总裁、首席布道师Jeff Barr在re:Invent 2023之前就迫不及待地写了一篇关于PartyRock的体验试玩教程即可窥见一斑。 事实也确实如此。在Las Vegas&am…

什么是HTML?

✨前言✨ 本文主要介绍什么是HTML以及W3C &#x1f352;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f352;博主将持续更新学习记录收获&#xff0c;友友们有任何问题可以在评论区留言 文章目录 什么是HTMLHTML发展史HTML的特点什么…

编程怎么学才能快速入门,分享一款中文编程工具快速学习编程思路,中文编程工具之分组框构件简介

一、前言&#xff1a; 零基础自学编程&#xff0c;中文编程工具下载&#xff0c;中文编程工具构件之扩展系统菜单构件教程 编程系统化教程链接 https://jywxz.blog.csdn.net/article/details/134073098?spm1001.2014.3001.5502 给大家分享一款中文编程工具&#xff0c;零基础…

Linux权限命令详解

Linux权限命令详解 文章目录 Linux权限命令详解一、什么是权限&#xff1f;二、权限的本质三、Linux中的用户四、linux中文件的权限4.1 文件访问者的分类&#xff08;人&#xff09;4.2 文件类型和访问权限&#xff08;事物属性&#xff09; 五、快速掌握修改权限的做法【第一种…

windows下分卷解压文件

我的文件是这样的&#xff1a; 存放路径为&#xff1a;C:\Users\Luli_study\MICCAI_MMAC\fudanuniversity\DDR dataset 首先要进入分卷文件的目录cd&#xff1a; 第一步&#xff1a;cd /path/o/分卷问文件目录 第二步&#xff1a; 执行之后的结果(红色框出来的)&#xff1a; …

如何掌握构建 LMS 网站的艺术

目录 什么是学习管理系统 (LMS) 在线课程和 LMS 网站的好处 为什么 WordPress 对于 LMS 网站很重要 统一学习中心 多功能性和可扩展性 提高教育参与度 简化管理和监控 节省时间和费用 技能评估和绩效监督 持续学习和技能提升 使用 WordPress 插件构建成功的 LMS 课程 专注于您的…

力扣257. 二叉树的所有路径(递归回溯与迭代)

题目&#xff1a; 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,null,5] 输出&#xff1a;["1->2->5","…

【小白专用】Sql Server 连接Mysql 更新23.12.09

目标 已知mysql连接参数&#xff08;地址和用户&#xff09;&#xff0c;期望通过Microsoft Sql Server Management Studio &#xff08;以下简称MSSSMS&#xff09;连接Mysql&#xff0c;在MSSSMS中直接查询或修改Mysql中的数据。 一般是选最新的版本下载。 选64位还是32位&a…