【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不能作为被操控数
在这里插入图片描述

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

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

相关文章

基于ssm的疫情物质管理系统论文

摘 要 进入信息时代以来,很多数据都需要配套软件协助处理,这样可以解决传统方式带来的管理困扰。比如耗时长,成本高,维护数据困难,数据易丢失等缺点。本次使用数据库工具MySQL和编程技术SSM开发的疫情物资管理系统&am…

全能数据分析软件Tableau Desktop 2019 mac功能亮点

Tableau Desktop 2019 mac是一款专业的全能数据分析工具,可以让用户将海量数据导入并记性汇总,并且支持多种数据类型,比如像是编程常用的键值对、哈希MAP、JSON类型数据等,因此用户可以将很多常用数据库文件直接导入Tableau Deskt…

光栅化渲染:优化技巧

我们在前面的章节中介绍的所有技术都是光栅化算法的基础。 不过,我们只是以非常基本的方式实现了这些技术。 GPU 渲染管道和其他基于光栅化的生产渲染器使用相同的概念,但它们使用这些算法的高度优化版本。 展示用于加速算法的所有不同技巧远远超出了介绍…

富时中国a50指数期货:探寻涨跌脉络

富时中国A50指数期货是衡量中国大陆50家最具代表性上市公司的指数。作为衍生品交易市场的重要一环,A50指数期货是投资者关注的焦点之一。其涨跌走势直接反映了中国大陆股市的整体表现和投资者情绪。 A50指数期货简介 富时中国A50指数期货由新加坡交易所&#xff0…

免费且好用的 MySQL 客户端

DBeaver 支持 Mac、Windows、Linux,提供 Eclipse 插件。社区版免费,支持主流的关系型数据库 官网地址:DBeaver Community | Free Universal Database Tool MySQL WorkBench MySQL WorkBench 是官方出品的客户端,支持 Mac、Windo…

AntDB数据库参加ACDU中国行杭州站,分享数据库运维实践与经验

关于ACDU与中国行: ACDU是由墨天轮社区举办的中国数据库联盟的品牌活动之一,在线下汇集数据库领域的行业知名人士,共同探讨数据库前沿技术及其应用,促进行业发展和创新的平台,也为开发者们提供友好交流的机会。 AntD…

SpringCloud微服务(简略笔记二)

Docker 概念 docker和虚拟机的差异 * docker是一个系统进程;虚拟机是在操作系统中的操作系统 * docker体积小,启动速度,性能好,虚拟机体积大,启动速度慢,性能一般 镜像和容器 镜像(image&…

使用 Python 实现简单的爬虫框架

爬虫是一种自动获取网页内容的程序,它可以帮助我们从网络上快速收集大量信息。在本文中,我们将学习如何使用 Python 编写一个简单的爬虫框架。 一、请求网页 首先,我们需要请求网页内容。我们可以使用 Python 的 requests 库来发送 HTTP 请…

【STM32F103】ADC 模拟数字转换器

ADC ADC(Analog-to-Digital Converter),模拟-数字转换器,也叫模数转换器,可以将连续变化的模拟信号转换为离散的数字信号。 我们可以外接上将采集信号转为模拟信号的模块,如光敏电阻传感器,热…

仓库拣货应用案例

多个订单的光挑选 PTL用于WIP(正在工作)机架 首先,我们的过程。 制造工厂很大,有大量的制造工具,非常密集,而且大量的高设备可能会阻碍无线电 晶片储存在一个密封的载体中,它们从一台机器运输…

Windows CMD cd命令无法使用,路径无法更改解决方法

故障表现: 1.cmd使用命令cd更改路径后,路径仍然显示为初始路径 解决方法: 1.先更改至指定盘符,再使用cd命令 2.使用cd命令后,再更改至指定盘符

[C++进阶]---AVL树模拟实现

目录 1.AVL树的概念2.AVL树模拟实现2.1AVL树节点的定义2.2AVL的插入2.3AVL树的旋转2.3.1左单旋2.3.2右单旋2.3.3右左双旋2.3.3.1旋转情况分析2.3.3.2平衡因子更新分析 2.3.4右左双旋2.3.4.1旋转情况分析2.3.4.2平衡因子更新分析 2.3.5AVL树的验证 3.AVL模拟实现源码4.总结 1.AV…

jetpack compose 学习(2)

jetpack compose 学习(1) 学会了如何创建一个compose项目,并成功run了起来 今天学习run起来的界面配置 找启动界面,当然是先找到界面的配置文件: androidManifest.xml 这个文件,然后通过启动项找到主界面, 第二步 按住ctrl 鼠标指向MainActivity 即可跳转主界面 进入后的界面…

_try_finally原理探究

无论try结构体中是什么代码,都会执行finally里面的代码 局部展开 当try里面没有异常,而是return、continue、break等语句时,就不会走_except_handle3这个函数,而是调用_local_unwind2进行展开 然后调用[ebx esi*4 8] 跟进去就到…

MySQL低版本中:字符串中的数字、英文字符、汉字提取

我们如何提醒一个字段中的汉字和数字呢 高版本指mysql8.0以上 使用sql语句 SELECT REGEXP_REPLACE(column_name, [^\\p{Han}], ) AS chinese_characters FROM table_name;其中 column_name指名称列,table_name是表名 2.低版本使用 需要新建函数 DELIMITER $$DR…

Java调用百度翻译API和调用有道翻译API进行翻译

目录 界面编写 调用百度API 调用有道API 源代码 界面编写 我们首先需要设计出这个翻译程序的GUI界面,我们写一个类继承自JFrame类,用来展示程序的主窗口,设置好窗口的名称和大小,设置在关闭窗口时终止程序,为了界…

高效数组处理的Numpy入门总结

NumPy是Python中一个重要的数学库,它提供了高效的数组操作和数学函数,是数据科学、机器学习、科学计算等领域的重要工具。下面是一个简单的NumPy学习教程,介绍了NumPy的基本用法和常用函数。 安装NumPy 在使用NumPy之前,需要先安…

删除Tencent files

QQ或者TIM卸载后,它还会残留在电脑上.要修改会说需要权限,修改权限又会重新变回去.这时候可以把整个文档放到其它盘,然后就可以删除Tencent files 方法是右键文档 选中属性–位置 然后就可以改掉了

【后端学前端】第三天 css动画 动态搜索框(定位、动态设置宽度)

1、学习信息 视频地址&#xff1a;css动画 动态搜索框&#xff08;定位、动态设置宽度&#xff09;_哔哩哔哩_bilibili 2、源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>test3</title>…

14:00面试,14:08就出来了,问的问题有点变态。。。。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到5月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…