逆向入门 汇编语言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语言模式
出来了呀