当前位置: 首页 > article >正文

逆向入门 汇编语言IDA的基本使用

前置知识

语言发展史:

原始的二进制语言 -> 汇编语言 -> C python等

1、进制和进制的转换

二进制转10进制

不用口算但是知道一些标识 :   二进制的开头是  0b

#  十进制为  dec    二进制函数为  bin
a=19
c=bin(a)
print("二进制函数为:"+c)

d=0b0101110
e=int(d)
print(f"十进制为{e}")

16进制转换  需要使用  hex 进行转换  所以为了区别他和别的数的区别会使用  0x   (还有一个区别就是16进制中最大的是 F )0进行区别

这个二进制转16进制是可以口算的比较方便     2的4次方=16 

所以每4个二进制表示一个16进制

a=0x3F
e=int(a)
print(e)

2、数据的宽度  字节序  ASCII

字节 byte   我们明白计算机储存数据是二进制的   0-7 记住包括编程语言他的数字的开头永远是 0  并且 底层就是二进制储存的     字节就是8位   

一位二进制   是   0,1    2的1次方

二位进制是     0 , 1 ,10,11    2的2次方

8位就是2的八次方  表示的数也  2的八次方

字节序:

大尾 :  把 01,02,03倒着放  也就是大的在前面   编程中位置越前越大

小尾相反

汇编语言

一套题学会

第一题 : 

知识1 : 寄存器   x86寄存器总结 - Frank__Chen - 博客园

寄存器的位数就是数据的宽度 16位就是  2的16次方

```asm
MOV AX, 10            //将立即数10移动到寄存器AX中
MOV BX, 5        /        /将立即数5移动到寄存器bx中
CMP AX, BX        //比较寄存器ax和bx的值
JG GREATER        //如果ax大于bx则跳转到标签greater
MOV CX, 0        //如果条件不成立执行这条指令将0移动到cx反之不执行
JMP END            无条件跳转到标签end
GREATER:            标签greater的位置
MOV CX, 1                将立即数1移动到寄存器cx中
END:                    标签end的位置
```

第一个指令

MOV   这个是进行赋值的     MOV   AX  , BX                表示把 BX的值给 AX最后的输出结果是  AX

CMP   进行比较大小     

J是表示跳转   后边的是条件

查一下表发现   JG是大于时进行跳转   AX > BX所以会跳转到        GREATER        

然后得出CX=1    回到原理的位置  jmp无条件跳转 END  结束程序

第二题

```asm
MOV CX, 3
MOV AX, 0
LOOP_START:
ADD AX, CX
DEC CX
JNZ LOOP_START                如果cx为0则结束循环
```

 问题
1. 程序执行后,寄存器 `AX` 的值是多少?

CX=3        AX=0     

LOOP_START:  表示进入循坏模式     

DEC    表示对  CX  进行  自减一  运算   就是 CX -1

但是CX=3     -1       之后为 2   然后 JNZ  上边那个表有个jns表示非负数    但是这个 z是zero的英语表示非  0

当然对应的计算还有 :

自增 :

INC
INC  CX

CX=4

就是上边有个  asm  这个其实就是C语言中进行汇编语言的标识

加法:

ADD
DX = 1
ADD  DX  CX   //表示  DX和 CX相加值给 DX   DX=4
减法
SUB

AX=1
SUB  CX AX   //表示把 CX=CX-AX

//CX=2

乘法:MUL 

AX=2
MUL AX    //得出  AX=4

第三题:

新知识 : 储存器 : 就是上边说的大尾小尾的储存方式  这个 [0x1000]  就是这个储存模式

```asm
MOV WORD [0x1000],         5将立即数·5移动到内存地址0*1000处
MOV AX, [0x1000]           将内存地址0*1000处的值加载到寄存器ax中  ax=5
ADD AX, 10                 将立即数10加载到寄存器ax中   ax=15
MOV [0x1000], AX           将寄存器ax的值储存到内存地址0*1000处  最后的储存地址是 [0x1000] 的储存值是   15
```

 问题
1. 程序执行后,内存地址 `0x1000` 中的值是多少?
15
 代码
```asm
MOV AX, 8        将立即数8移动到寄存器ax中
MOV BX, 8        将立即数8移动到寄存器bx中
CMP AX, BX        比较寄存器ax和bx的值
JE EQUAL            如果ax等于bx则跳转到标签equal
MOV CX, 0        将立即数0移动到cx如果条件成立则不执行
JMP END            无条件跳转到end反之跳转到equal
EQUAL:            标签equal的位置
MOV CX, 1        将立即数1移动到寄存器cx中
END:            标签end的位置
```

 问题
1. 程序执行后,寄存器 `CX` 的值是多少?
知识1、  cmp 是进行比较      je是相等时会进行跳转所以得出  cx=1

第五题

```asm
MOV AX, 12        将立即数12移动到寄存器ax中
MOV BX, 15        将立即数15移动到寄存器bx中
CMP AX, BX            比较ax和bx的值
JL LESS            如果ax小于bx则跳转到less
MOV CX, 0如果不成立将0移动到cx中反之不会执行
JMP END                无条件跳转到end
LESS:标签less的位置
MOV CX, 1            将立即数1移动到寄存器cx中
END:结束



程序执行后,寄存器 `CX` 的值是多少?
Cx=1

第六题

```asm
MOV WORD[0x3000], 9    将立即数9移动到内存地址0*3000处
MOV AX, [0x3000]        将内存地址0*3000处的值加载到寄存器ax中  ax=9
SUB AX, 3                将立即数3从寄存器ax中减去
MOV [0x3000], AX            将寄存器ax的值存储到内存地址0*3000处
```


程序执行后,内存地址 `0x3000` 中的值是多少?
6

第七题

```asm
MOV AX, 0x1234        将立即数0*1234移动到寄存器ax中
MOV BX, 0x5678        将立即数0*5678移动到寄存器bx中
XCHG AX, BX将寄存器ax和bx的值互换
```
1. 执行后,寄存器 `AX` 和 `BX` 的值分别是多少?

 答案
Ax0*5678
Bx0*1234

新知识    XCHG   互换运算

第八题

```asm
MOV AX, 5                将立即数5移动到寄存器ax中  ax=5
CALL DOUBLE            跳转到double
MOV [0x2000], AX            将寄存器ax的值存储到内存地址0*2000处
JMP END                        无条件转到end

DOUBLE:                跳转到这里double的位置
ADD AX, AX            将寄存器ax的值加到自身  ax=10
RET
                       RET  返回到call 都double的下一条指令
END:
```结束



1. 执行后,内存地址 `0x2000` 的值是多少?
10


新知识 :  call 唤起子程序   : (call在编程语言中是 调用函数的意思)

第九题

```asm
MOV AL, 0b10101010            将二进制数0b10101010移动到寄存器al中
XOR AL, 0b11110000
```将寄存器al的值与二进制数0b11110000进行按位异或运算
//异或就是  想同为0   相异为 1

 问题
1. 执行后,寄存器 `AL` 的二进制值是多少?

IDA的基本使用

然后我们运行一次 这个welcome.exe

回显hello ctf  我们使用32位的ida打开

有个技巧就是按空格是会进行切换视图的

可以搜一下Hello  CTF   这个不就是运行的窗口啊  那就看一下有没有信息

点进去发现没有信息

不要慌还有神操作没用  直接  f5 进入伪C语言模式

出来了呀


http://www.kler.cn/a/592442.html

相关文章:

  • 【java面型对象进阶】------继承实例
  • VBA技术资料MF281:驱动器列表和类型
  • 学习threejs,构建THREE.ParametricGeometry参数化函数生成几何体
  • 基于 Quest 摄像头数据开发的原理介绍【Unity Meta Quest MR 开发教程】
  • 微前端 qiankun vite vue3
  • 使用码云搭建CocoaPods远程私有库
  • 人事档案管理系统基于Spring BootSSM
  • LS-NET-006-思科MDS 9148S 查看内存
  • 【微服务】基于Lambda ESM的预留模式调整Kafka ESM吞吐量的实战
  • Spring Boot集成MyBatis与MySQL
  • Swagger-告别手写文档
  • 第十五届蓝桥杯C/C++组:宝石组合题目(从小学奥数到编程题详解)
  • 【嵌入式Linux】基于ArmLinux的智能垃圾分类系统项目
  • 构建高效复杂系统的关键:架构与模块详解
  • 【Java】Mybatis学习笔记
  • k8s常用知识点总结
  • Matlab 汽车振动多自由度非线性悬挂系统和参数研究
  • USB(Universal Serial Bus)详解
  • ETL中的实用功能以及数据集成方式
  • 基于Spring Boot的流浪动物救助平台的设计与实现(LW+源码+讲解)