2.pwn的linux基础(计算机内部数据结构存储形式)

linux基础

保护层级:

分为四个ring0-ring3
一般来说就两个,0和3
0为内核
3为用户 

权限:

用户分为多个组
文件和目录等等的权限一般都是三个,即可读可写可执行。
读:R,写:W,执行:X
赋予一个可执行文件执行权限就是chmod +x filename

虚拟内存和物理内存:


物理内存很直白,就是内存中实际的地址。
虚拟内存是物理内存经过MMU转换后的地址(页表)
系统会给每个用户进程分配一段虚拟内存空间
所以说我们调试的可执行程序的内存空间布局都差不多,但是是虚拟内存,不是实际的物理内存。

Linux基础命令 

学会看源码


linux是开源的,他的代码实现都可以查到,
我们研究Iinux的机制,最重要的武器就是源码
分析源码是一个安全研究者必备的技能。
https://elixir.bootlin.com
https://code.wobog.org 

大端小端序

Iinux数据存储的格式为小端序

速记口令:大端序:高低低高

                  小端序:高高低低


计算机内部有两种数据的存储形式:大端序、小端序

大端序:数据高位存储在计算机地址的低位,数据低位存储在地址的高位

小端序:数据高位存储在计算机地址的高位,数据低位存储在地址。

例子:

以一个数据:0x0123456789abcdef为例,
0为低地址,7为高地址。

大端序存储

按照大端序的原则,数据最高位01存储在低位,最低位ef存储在高位,

将此数据按照字符串输出,得到的为:\x01\x23\x45\x67\x89\xab\xcd\xef

小端序存储

按照小端序的原则,数据最高位01存储在高位,.最低位ef存储在低位。

将此数据按照字符串输出,得到的为:\xef\xcd\xab\x89\x67\x45\x23\x01 

小端序

linux是小端序,所以如果我们以字符串的形式输入一个数字时,要注意格式
比如输入0xdeadbeef这个数字
字符串输入就是”xeflxbelxadlxde”传入给程序
好在有pwntools,p32(0xdeadbeef)即可完成自动转换 (32=4个字节(ef be ad de)x8)

文件描述符

Linux 系统中,把一切都看做是文件,当进程打开现有文件或创建新文件时内核向进程返回一个文件描述符,,文件描述符就是内核为了高效管理已被打开的文件所创建的索引,用来指向被打开的文件,所有执行I0操作的系统调用都会通过文件描述符
每个文件描述符会与一个打开的文件相对应,不同的文件描述符也可能指向同一个文件
相同的文件可以被不同的进程打开,也可以在同一个进程被多次打开

我们会在open、read、write这些常见函数中见到。
0标准输入(stdin)、1标准输出(stdout)、2标准错误(stderr)
read(0,buf,size)从stdin中读size个数据到buf中
write(1,buf,size)从buf中取size个数据到stdout中

栈(stack)


栈就是个阉割版的数组,只能在一头操作,为什么不直接用数组呢?
一把菜刀可以干很多事情,切菜刮皮剁骨头。
但是在刮皮的时候我们还是会选择用刮皮刀,原因很简单,更方便

栈是一种数据结构,他是一种先进后出(LIFO:last in first out)的数据结构。
栈的基本操作有两种:push(压栈)和pop(弹栈)。
由于函数调用顺序也是LIFO,所以我们能接触到的绝大多数系统,都是通过栈这一数据结构来维护函数调用关系。

linux中的栈

在linux系统中,系统为每一个进程都安排了一个栈,进程中每一个调用的函数都有自己独立的栈帧(栈里的一段区域)

在linux系统中,栈是由高地址向低地址生长
高地址为栈底,低地址为栈顶
我们接触到的一些算法,很多都是用栈来实现的,比如DFS,
DFS会将发现的节点存储在栈中,然后访问的顺序就是LIFO,
但是很多这种LIFO的算法都会以递归的形式实现,
其实,递归的形式实现这些算法本质上来说也是利用栈结构,只不过他没有在程序中另外申请一个栈,而是用的函数调用栈。

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

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

相关文章

qt 如何添加子项目

首先我们正常流程创建一个项目文件: 这是我已经创建好的,请无视红线 然后找到该项目的文件夹,在文件夹下创建一个文件夹,再到创建好的文件夹下面创建一个 .pri 文件: (创建文件夹) &#xff08…

字节跳动与南开联合开源 StoryDiffusion:一键生成漫画和视频故事的神器!完全免费!

大家好,我是程序员X小鹿,前互联网大厂程序员,自由职业2年,也一名 AIGC 爱好者,持续分享更多前沿的「AI 工具」和「AI副业玩法」,欢迎一起交流~ 漫画,是多少人童年的回忆啊! 记得小学…

#数据结构 链式栈

1. 概念 链式栈LinkStack 逻辑结构:线性结构物理结构:链式存储栈的特点:后进先出 栈具有后进先出的特点,我们使用链表来实现栈,即链式栈。那么栈顶是入栈和出栈的地方,单向链表有头有尾,那我…

Http中get与post的区别,99%的人都理解错了吧

Get和Post是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二。 最直观的区别 就是Get把参数包含在URL中,Post通过request body传递参数。 你可能自己写过无数个Get和Post请求,或者已经看过很多权威网站总…

【ARMv8/v9 GIC 系列 5.7 -- 中断路由与系统寄存器】

请阅读【ARM GICv3/v4 实战学习 】 文章目录 Interrupt routing and System register access与Group 0中断相关的寄存器与Group 1中断相关的寄存器公共寄存器Interrupt routing and System register access 在执行AArch64状态时,中断路由到异常级别(Exception Level)是由以…

容器:stack

以下是关于stack容器的一些总结: stack容器比较简单,主要包括: 1、构造函数:stack [staName] 2、添加、删除元素: push() 、pop() 3、获取栈顶元素:top() 4、获取栈的大小:size() 5、判断栈是否为空&#x…

Linux运维之管道符、重定向与环境变量

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 目录 一、输入输出重定向 二、管道命令符 三、命令行的通配符 四、常用的转义字符 五、重要的环境变量 致谢 一、输入输出重定向 输入重定向是…

javascripr如何设计弹出输入框并在网页内输出输入内容

javascript如何设计弹出输入对话框 这里就需要用到prompt语言 它的语法格式是 prompt(对话框内容) 如何把在对话框里输入内容输出到网页里,需要先定义一个变量,用var或let都可以。 假定变量名为a,代码是 let aprompt(请输入…

Python统计实战:时间序列分析之一元线性回归预测和指数曲线预测

为了解决特定问题而进行的学习是提高效率的最佳途径。这种方法能够使我们专注于最相关的知识和技能,从而更快地掌握解决问题所需的能力。 (以下练习题来源于《统计学—基于Python》。请在Q群455547227下载原始数据。) 练习题 下表是某只股票…

Mysql数据库基础操作

Mysql数据库 基本概念 内核的作用:调用硬件资源 数据库的作用 使用数据库可以高效且条理分明地存储数据,使人们能够更加迅速、方便的管理数据。 数据、表、数据库 数据 描述事物的符号记录,包括数字,文字,图形&…

nginx的正向代理和反向代理以及tomcat

nginx的正向代理和反向代理: 正向代理以及缓存配置: 代理:客户端不再是直接访问服务端,通过代理服务器访问服务端。 正向代理:面向客户端,我们通过代理服务器的IP地址访问目标范围端。 服务端只知道代理…

开发个人Go-ChatGPT--3 服务拆分

开发个人Go-ChatGPT–3 服务拆分 个人Go-ChatGPT项目可拆分用户服务(user),AI模型服务(AiModel),… 每个服务都可以再分为 api 服务和 rpc 服务。api 服务对外,可提供给 app 调用。rpc 服务是…

如何利用算法优化广告效果

效果广告以超过67%的占比,成为了中国互联网广告预算的大头。在BAT、字节等大的媒体平台上,效果广告以CPC实时竞价广告为主。在这种广告产品的投放中,广告主或其代理公司通过针对每个广告点击出价,系统自动把这些点击出价换算成eCP…

Java + MySQL 实现存储完整 Json

Java MySQL 实现存储完整 Json 一、应用场景二、数据库配置三、后端代码配置1、maven 依赖2、实体类3、Service 实现类4、xml 文件 四、测试1、新增接口2、查询接口3、数据表内容 一、应用场景 将前端传过来的 Json 完整存储到 MySQL 中,涉及技术栈为 Java、MyBat…

揭秘 Vue 组件通信:构建响应式数据流

引言 Vue.js 的核心特性之一是其组件化架构。组件化开发是一种现代的前端开发模式,它鼓励开发者将用户界面拆分成独立的、可复用的组件。每个组件都有自己的逻辑和结构,使得代码更加模块化,易于维护和测试。 Vue 组件基础 组件的定义和用途…

从资金管理的角度 谈谈伦敦金投资技巧

刚进入伦敦金市场的时候,笔者认为技术分析是很重要的,所以将学习伦敦金投资技巧的精力全部投入到技术分析的学习中。经过一系列交易的亏损,笔者才发现,其实交易管理才是最重要的。如果管理得好,30%的胜率,投…

docker-compose部署node-exporter

一、安装 node_exporter:image: prom/node-exporter:v1.8.0container_name: node_exportervolumes:- /proc:/host/proc:ro- /sys:/host/sys:ro- /:/rootfs:ro# ports:# - 9100:9100environment:TZ: Asia/Shanghaicommand:- --path.procfs/host/proc- --path.rootfs/rootfs- -…

数据机构记录顺序表-笔记1

一、线性表的基本概念 数据元素:线性表中的基本单位,每个元素都是线性表的一部分。 数据项:数据元素的具体值。 存储位置:线性表中的元素在内存中的具体存储位置。 线性表按存储结构可以分为顺序表和链表两大类: 1.1…

嵌入式C语言面试相关知识——关键字(不定期更新)

嵌入式C语言面试相关知识——关键字 一、博客声明二、C语言关键字1、sizeof关键字2、static关键字3、const关键字4、volatile关键字5、extern关键字 一、博客声明 又是一年一度的秋招,怎么能只刷笔试题目呢,面试题目也得看,想当好厂的牛马其实…

快速上手指南:使用 Minikube 在本地运行 Kubernetes 集群

前言 Minikube 是一个开源工具,用于在本地运行 Kubernetes 集群。它提供了一种简单的方法来在本地开发和测试 Kubernetes 应用程序,而无需设置完整的 Kubernetes 集群。以下是 Minikube 的基本使用步骤: 安装 Minikube 安装依赖项 虚拟化…