02Reverse基础(三)

任务内容

① 学习linux操作系统的使用,建议使用linux(通常来说ubuntu)作为主操作系统,多用用命令行。
我给大家列了一些:
命令行关机
命令行打开firefox浏览器
命令行打开vscode
命令行安装一个deb软件包
vim/vi的基本操作,编辑、保存、退出
如何修改apt更新源
如何修改host文件
如何通过命令行查找一个文件(find命令)
如何修改网络,使用静态IP以及设置DNS服务器
如何添加路由
如何使用中文输入法(我不建议使用中文输入法)
如何让自己的shell看起来更加强大
/bin/sh和/bin/bash的区别,哪个更好用?
如何杀死一个进程
如何开启/关闭一个服务?有几种方式?至少掌握一种(可以通过搭建一个web服务器作为练习)
。。。等等
② 继续学习掌握汇编语言,掌握标志寄存器的用法

学习笔记

概述:(从访问内存的角度)
3.1内存中字的存储
1.在0地址处开始存放20000(4E20H):高地址对应高地址位(1),低地址对应低地址位(0)。
在这里插入图片描述
问题:
(1)0地址单元中存放的字节型数据是多少?20H(没说什么单元,就是字节单元)
(2)0地址字单元中存放的字型数据是多少?4E20H
(3)2地址单元中存放的字节型数据是多少?12H
(4)2地址字单元中存放的字型数据是多少?0012H
(5)1地址字单元中存放的字型数据是多少?124EH(1、2单元组成)
注意:字型是16位,字节型是8位(一个字节是8位)。
结论:任何两个地址连续的内存单元,N号单元和 N+1号单元,可以将它们看成两个内存单元(2个字节单元) ,也可以看成一个地址为N的字单元中的高位字节单元和低位字节单元。
3.2 DS和[address]
1.CPU要读取一个内存单元的时候,必须先给出这个内存单元的地址;
2.在8086PC中,内存地址由段地址和偏移地址组成,8086CPU中有一个DS寄存器,通常用来存放要访问的数据的段地址。用mov指令要访问内存单元,可以在mov指令中只给出单元的偏移地址,此时,段地址默认在ds寄存器中。
例如:读取10000H单元(1000:0)的内容,
在这里插入图片描述
关于最后一条mov al,[0]的解释:
首先,mov指令可以完成的传送功能:
(1)将数据直接送入通用寄存器:mov ax,2
(2)将一个寄存器中的内容送入另一个寄存器:mov bx,ax
这里还有:(3)将一个内存单元中的内容送入一个寄存器:mov al,[0]
其次,是从哪个单元送到哪个寄存器中呢?
mov指令的格式:mov 寄存器名,内存单元地址
而[……]表示一个内存单元,[……]中的0表示内存单元的偏移地址。
执行指令时,8086CPU自动取DS中的数据为内存单元的段地址。
那么,如何用mov指令从10000H中读取数据?
10000H表示为1000:0(段地址:偏移地址)
将段地址1000H放入ds
用mov al,[0]完成传送(说明这个内存单元的偏移地址是0,它的段地址默认放在ds中)
但是,如何把1000H送入ds呢?为什么代码段里面分成了两步?
8086不支持将数据直接送入段寄存器,但是可以直接送入通用寄存器,而ds是一个段寄存器。
即:数据——》通用寄存器——》段寄存器
3.一个问题:如何将数据从寄存器送入内存单元?
答:mov bx,1000H(将要访问的内存单元的段地址放入通用寄存器)
mov ds,bx
mov [0],al
3.3字的传送
1.8086是16位的结构,有16根数据线,所以可以一次性传送16位数据,也就是一次性传送一个字。(一个字等于两个字节)
在这里插入图片描述
注意:为什么这里是字型数据呢,因为是ax,这是16位的,因此用字型数据;
如果是ah或者是al,那么就算8位的,则为字节型数据;
2.一个问题:
在这里插入图片描述
自己写的:发现一个很大的问题:内存的数据没有放进去!!!
改正后:(注意cs和ip的指令就是当前要读取的指令,不可以把cs和ip放在1000和0内,因为会把刚刚写进去的内容覆盖!!!!!!!!!!!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3.4mov,add,sub指令
mov指令的几种形式:
(1)mov 寄存器,数据
(2)mov 寄存器,寄存器
(3)mov 寄存器,内存单元:mov al,[0]
(4)mov 内存单元,寄存器:mov [0],al
(5)mov 段寄存器,寄存器:mov ds,ax
(6)mov 寄存器,段寄存器
(7)mov 内存单元,段寄存器
3.5数据段
1.我们可以将一组长度为N(N≤64K)、地址连续、起始地址为16的倍数的内存单元当作专门存储数据的内存空间,从而定义了一个数据段。
2.用123B0H~123B9H这段空间来存放数据:
段地址:123BH(这个段地址其实是不唯一的)
长度:10字节
3.如何访问指定数据段中的数据?用ds存放数据段的段地址,再根据需要,用相关指令访问数据段中的具体单元。例如:
在这里插入图片描述
问题:写几条指令,累加数据段中的前三个字型数据。
在这里插入图片描述
检测点3.1
在这里插入图片描述
答案:ds设置段地址是0010
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
③数据和程序在计算机中都是以二进制形式存放的,区别:cs段地址里面存放的是程序指令,ds段地址里面存放的是数据。
3.6栈
1.栈是一种具有特殊的访问方式的存储空间。它的特殊性就在于,最后进入这个空间的数据,最先出去。
2.栈的两个基本操作:入栈(将一个新的原色放到栈顶)和出栈(从栈顶取出一个元素)
3.7CPU提供的栈机制
1.8086CPU提供相关的指令来以栈的方式访问内存空间。即我们基于8085CPU编程时,可以将一段内存当作栈来使用。
2.8086CPU的入栈和出栈操作都是以字为单位进行的,因此,字型数据用两个单元存放
push ax(入栈)
(1)SP=SP–2;
(2)将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶。
pop ax(出栈)
(1)将SS:SP指向的内存单元处的数据送入ax中;
(2)SP = SP+2,SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。
3.两个问题:
(1)CPU如何知道当前要执行的指令所在的位置?
答:寄存器CS和IP中存放着当前指令的段地址和偏移地址
8086CPU中有两个寄存器:
段寄存器SS——存放栈顶的段地址
寄存器SP——存放栈顶的偏移地址
因此,任意时刻,SS:SP指向栈顶元素
(2)执行PUSH和POP的时候,如何知道哪个单元是栈顶单元?
答:
push ax(入栈)
(1)SP=SP–2;
(2)将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶。
pop ax(出栈)
(1)将SS:SP指向的内存单元处的数据送入ax中;
(2)SP = SP+2,SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。
因此这个SP是时刻变化的。
问题:
在这里插入图片描述
注意:当栈为空的时候,栈中没有元素,也就不存在栈顶元素。栈最底部字单元的地址是1000:000E,因此栈空时,SP=0010H
3.8栈顶超界问题
1.8086CPU不保证对栈的操作不会超界(8086CPU只知道栈顶在何处,但是并不知道栈空间有多大),但是栈顶超界是危险的。
2.因此可以看出8086CPU的互作原理:(只考虑当前的情况)
(1)当前栈顶在何处
(2)当前要执行的指令是哪一条
3.编程时要根据用到的最大栈空间来安排栈的大小,防止超界,执行出栈时也要注意以防栈空的时候继续出栈而导致超界。
3.9 push和pop指令
1.这两个指令是可以在寄存器和内存之间传送数据的。
2.栈空间知识内存空间的一部分,它知识一段可以以一种特殊的方式进行访问的内存空间。
3.push和pop后面可以加:寄存器(ax,bx),段寄存器(ds,es),内存单元([0],[1])
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意:用栈来暂存以后需要恢复的寄存器中的内容时,出栈的顺序要和入栈的顺序相反,因为最后入栈的寄存器的内容在栈顶,所以在恢复时,要最先出栈。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
答案:在这里插入图片描述
分析sp 2:
在这里插入图片描述
补充:push和pop命令实质上就是一种内存传送指令,可以在寄存器和内存之间传送数据,与mov指令不同的是,push和pop指令访问的内存单元的地址不是在指令中给出的,而是由SS:SP指出的,同时两命令还要改变sp中的内容(push时先改变sp-2后传送,pop时先传送后改变sp+2)
3.10栈段
1.对于8086PC机,在编程时,我们可以根据需要 ,将一组内存单元定义为一个段,一个栈段的容量最大为64KB。
注意:CPU将内存中的某段内存当作代码,是因为CS:IP指向了那里;CPU将某段内存当作栈是因为SS:IP指向了那里。
检测点3.2
在这里插入图片描述
设置好段的段地址和偏移地址即可:
mov ax,2000H
mov ss,ax
mov sp,10H
在这里插入图片描述
设置好段的段地址和偏移地址即可:
mov ax,1000H
mov ss,ax
mov sp,0

任务实现

1.命令行关机

在这里插入图片描述

2.打开火狐浏览器

直接输入firefox
在这里插入图片描述

3.命令行打开vscode(安装deb软件包)

(1)vscode:全名Visual Studio Code,是一样编辑器,(不是一个完整的ide,需要自己搭建环境),程序员用来写代码的软件。”
(2)下载vscode的deb
(3)下载好了放到一个文件夹里面,在文件所在文件夹打开终端,右键在此打开终端,输入命令:sudo apt-get -f --fix-missing install,输入命令:sudo dpkg -i 空格 把文件拖进去
在这里插入图片描述
(4)打开运行
在这里插入图片描述

4.vim/vi的基本操作,编辑、保存、退出

在这里插入图片描述
(1)使用hjkl来移动光标:
分别代表:左下上右
(2)插入模式
键盘输入i在光标的前边进入输入模式,o在光标所在行的下方新建一行并进入插入模式,s删除光标指定的字符并进入插入模式,点击Esc就会退出插入模式;保存退出:按Shift然后按两个Z即可或者是:wq。
(3)删除命令
(a)在普通模式下,删除单一字符可用x命令
(b)删除更多字符可用d命令,d+motion
定位到行首是用0,行尾用$,单词的词首用b,单词的结尾用e,下一个单词的起始处w,文件的开头用gg,文件的末尾用G。而数字+motion就是重复多个motion,d+数字+motion表示删除多个motion范围。
(4)撤销
(a)u表示撤销最后一次修改
(b)U表示撤销对整行的修改
(c)Ctrl+r快捷键可以恢复撤销的内容
(5)粘贴命令
在vim中使用删除命令,并不会直接将你的东西删掉,而是放到vim的寄存器。
使用p命令可以将最后一次删除的内容粘贴到光标之后(P命令是粘贴到光标之前)
注意:如果需要粘贴的是整行为单位,那么p命令将在光标的下一行开始粘贴;如果拷贝的是非整行的局部字符串,那么p命令将在光标后开始粘贴。
(6)拷贝命令
用y命令:y+数字+motion表示拷贝多个motion范围
(7)替换命令
r命令用于替换光标所在的字符,做法是先将光标移动到需要替换的字符处,按一下r键,然后输入新的字符
在键入r命令前输入数字,表示从光标开始往后,将多个字符统一替换为新字符
R命令可以一步进入替换模式。
(8)修改命令
注意:修改会进入插入模式,而替换不会进入插入模式
vim用c命令实现修改,c+数字+motion表示
修改=删除+进入插入模式

5.修改apt更新源

(1)sudo apt-get update更新软件源,最后会读取软件包列表
在这里插入图片描述
(2)sudo apt-get dist-upgrade,更新所有的软件
在这里插入图片描述
(3)如果想要安装相应的软件,自需输入 sudo apt-get install 软件名

6.修改host文件

(1)输入vim /etc/hosts:
在这里插入图片描述
(2)使用ping命令查看配置是否生效:
在这里插入图片描述

7.通过命令行查找一个文件(find命令)

(1)find 搜索文件的命令格式:find [搜索范围] [匹配条件]
-name 根据名字查找
-size 根据文件大小查找, +,-:大于设置的大小,直接写大小是等于
-user 查找用户名的所有者的所有文件
-group 根据所属组查找相关文件
-type 根据文件类型查找(f文件,d目录,l软链接文件)
-inum 根据i节点查找
-amin 访问时间access
-cmin 文件属性change
-mmin 文件内容modify
(2)find 搜索目录 -name 目标名字
find / -name file 注意:/代表是全盘搜索,也可以指定目录搜索
(3)find 搜索目录 -size 文件大小
例如:查找下大于100MB的文件,应该实际是102400KB*2,所有搜索命令为find / -size +204800
注意:-号是小于,+号是大于,直接写数字就是等于
(4)find 搜索目录 -user 用户名
例如:这里是查找属于用户名为user1的文件:find / -user user1(自己就用fengjiaqi)
(5)find 搜索目录 -type d查找某个目录下的所有目录
例如:find /tmp -type d
(6)find 搜索目录 -cmin -时间(单位分钟)查找etc下面1小时内被修改的文件,根目录下面太多了,指定一个目录
例如:find /etc -cmin -60
(7)find命令是可以多个选项一起添加查询的:-a 是前后条件都要满足;-o 是满足一个条件就好
例如刚刚的文件查找,60分钟内被修改的文件,并且文件名字包含conf的,我们可以这样写
find /etc -cmin -60 -a -name *conf这样我们可以清除的看到被过滤掉的文件

8.修改网络,使用静态IP以及设置DNS服务器

(1)使用ifconfig -a命令查看本机的IP
在这里插入图片描述
(2)查看DNS
在这里插入图片描述

9.添加路由

(1)route -n显示现在所有路由
在这里插入图片描述
(2)linux下添加路由的方法:
(a)使用 route 命令添加:使用route 命令添加的路由,机器重启或者网卡重启后路由就失效了
#添加到主机的路由
# route add –host 192.168.168.110 dev eth0
# route add –host 192.168.168.119 gw 192.168.168.1
#添加到网络的路由
# route add –net IP netmask MASK eth0
# route add –net IP netmask MASK gw IP
# route add –net IP/24 eth1
#添加默认网关
# route add default gw IP
#删除路由
# route del –host 192.168.168.110 dev eth0
(b)在linux下设置永久路由的方法:
(Ⅰ)在/etc/rc.local里添加
route add -net 192.168.3.0/24 dev eth0
route add -net 192.168.2.0/24 gw 192.168.3.254
(Ⅱ)在/etc/sysconfig/network里添加到末尾
GATEWAY=gw-ip 或者 GATEWAY=gw-dev
(Ⅲ)/etc/sysconfig/static-router :
any net x.x.x.x/24 gw y.y.y.y

10.使用中文输入法

shift

11.让自己的shell看起来更加强大

(1)查看
在这里插入图片描述
(2)创建一个.sh脚本
在这里插入图片描述
在这里插入图片描述

12./bin/sh和/bin/bash的区别,哪个更好用?

GNU/Linux操作系统中的/bin/sh本是bash (Bourne-Again Shell) 的符号链接,但鉴于bash过于复杂,有人把bash从NetBSD移植到Linux并更名为dash (Debian Almquist Shell),并建议将/bin/sh指向它,以获得更快的脚本执行速度。Dash Shell 比Bash Shell小的多,符合POSIX标准。
shell脚本中主要有以下两种方式:网上说:
(a) #!/bin/sh:source不成功,不会运行source后面的代码
(b) #!/bin/bash:source不成功,但还是会运行source后面的echo语句
但是呢:
在这里插入图片描述在这里插入图片描述
更改后:
在这里插入图片描述
在这里插入图片描述

13.杀死一个进程

(1)首先要找到它的ID
在这里插入图片描述
(2)然后杀掉它
在这里插入图片描述

14.开启/关闭一个服务?有几种方式?

(1)搭建一个web服务器
在这里插入图片描述
打开火狐:
在这里插入图片描述
(2)安装完毕后,我们检查是否启动了Apache服务:
在这里插入图片描述
(3)一些操作Apache的常用命令:开启、关闭和重启服务器
• /etc/init.d/apache2 start //启动Apache服务
• /etc/init.d/apache2 stop //停止Apache服务
• /etc/init.d/apache2 restart //重启Apache服务
实践:
①开启
(3)一些操作Apache的常用命令:开启、关闭和重启服务器
• /etc/init.d/apache2 start //启动Apache服务
• /etc/init.d/apache2 stop //停止Apache服务
• /etc/init.d/apache2 restart //重启Apache服务
实践:
①开启
在这里插入图片描述
在这里插入图片描述
②关闭
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值