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

news/2024/5/19 21:56:20 标签: 学习, 笔记, CTF, 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.niftyadmin.cn/n/5252044.html

相关文章

ThinkPHP6使用Validate验证表单字段唯一

ThinkPHP6使用Validate验证表单字段唯一 1.创建用户验证文件,如User 1.1 单应用创建验证文件 php think make:validate User 1.2 多应用创建验证文件,admin为应用名, php think make:validate adminUser 创建成功后,应用内会…

Vue笔记(三)深入组件

组件注册 组件注册有两种方式: 全局注册 可以使用Vue应用实例的.component()方法,让组件在当前Vue应用中全局可用,.component()方法可以被链式调用。全局注册的组件可以在此应用的任意组件的模版中使用。import { createApp } from vue imp…

【每周一测】Java阶段四第二周学习

目录 1、在MyBatis中,当实体类中的属性名和表中的字段名不一样,除了( )都可以实现属性和数据的映射。 2、下列数组定义及赋值,错误的是( ) 3、关于会话跟踪以下说法错误的( &…

管理和监控CentOS上的HTTP服务

CentOS作为一款稳定的开源服务器操作系统,为各种网络服务提供了优秀的支持。其中,HTTP服务是互联网上最常用的服务之一,它为人们提供了便捷的信息访问和交互方式。在CentOS上管理和监控HTTP服务是一项重要的任务,下面我们将介绍一…

【贪心算法】 Opponents

这道题写伪代码就好了! Description Arya has n opponents in the school. Each day he will fight with all opponents who are present this day. His opponents have some fighting plan that guarantees they will win, but implementing this plan requires pr…

FPGA时序分析与约束(0)——目录与传送门

一、简介 关于时序分析和约束的学习似乎是学习FPGA的一道分水岭,似乎只有理解了时序约束才能算是真正入门了FPGA,对于FPGA从业者或者未来想要从事FPGA开发的工程师来说,时序约束可以说是一道躲不过去的坎,所以这个系列我们会详细介…

算能PCIe开发环境搭建-一些记录

开发环境与运行环境: 开发环境是指用于模型转换或验证以及程序编译等开发过程的环境;运行环境是指在具备Sophon设备的平台上实际使用设备进行算法应用部署的运行环境。 开发环境与运行环境可能是统一的(如插有SC5加速卡的x86主机,…

力扣:199. 二叉树的右视图(Python3)

题目: 给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 来源:力扣(LeetCode) 链接:力扣(LeetCode&#xff09…