Re练习之ASM汇编逆向
基本介绍
以一个耳熟能详的Hello World程序切入:
|
通过gcc编译为ASM形式并输出得到:
.section .rodata |
过程很简单,
首先的.LC0定义了前面的Hello World!字符串,告诉编译器该字符串的地址。
下面的则是main函数的汇编块:
- 第8-12行为
初始化堆栈,开辟适合的内存区域,而rbp、rsp、edi则是寄存器,负责储存数据。 - 13行后都是执行函数。
常见的汇编指令:mov、sub、call、ret等。
mov:赋值。格式为mov 被赋值方 要赋的值;sub:递减。call:调用。ret&leave:出栈。代表一个函数的结束。(通常在wasm中leave不常见)
常见指令
1.loop循环指令:
mov rax,0 |
以上执行的便是对123累加236次。在上述代码中,rcx寄存器保存循环次数;loop指令每执行一次,rcx -1。
2.无条件跳转指令:
lable: |
上述的jmp即为无条件跳转。
3.条件跳转指令:
lable: |
上述代码将ebx的值与0对比:为真,跳转至lable,所以je为条件跳转关键词。
一般的条件跳转指令与cmp、test指令混在一起用:
lable: |
常见的条件跳转指令:
je:等于(Jump if Equal )jne:不等于(Jump if Not Equal)jz:零标志位为1(Jump if Zero)jnz:零标志位为0(Jump if Not Zero)js:符号标志位为1(Jump if Sign)jns:符号标志位为0(Jump if Not Sign)jp或jpe:奇偶标志位为1jnp或jpo:奇偶标志位为0jo:溢出标志位为1jno:溢出标志位为0jg或jnle:大于jge或jnl:大于/等于JL或JNGE:小于JLE或JNG:小于/等于
常见的位运算指令:
AND:与运算。AND AX, BX,即AX与BX进行逻辑与运算,保存结果至AXOR:或运算。OR AX, BX,即AX与BX进行逻辑或运算,保存结果至AXXOR:异或运算。XOR AX, BX,即异或运算,保存结果至AXNOT:取反操作。NOT CX,将CX取反,保存结果至CX中
4.函数传参:
通常函数の返回值保存在ax寄存器(eax、rax)
参数一般按顺序保存在cx、dx、si中
在64位汇编当中,则按照rcx、rdx、r8、r9、r10、r11 ...顺序储存
5.lea地址加载:
格式为lea rdx, [my_var],将my_var地址赋值给rdx寄存器。
6.xchg数值交换:
格式为xchg ax, bx,将ax与bx的数值交换
例题
一.[HDCTF 2023]easy_asm
IDA打开附件,只有一个start函数,空格切换至汇编代码:

和

很容易看到,待解密的flag就是seg001的内容,
圈出来的便是xor加密逻辑:al存储seg001的值,cl存储异或的key "0x10"。
要想解密,就得异或回去,seg001 ^0x10 = decrypt_flag
最终的exp:
enc_flag = [ |
暂时只做了这一道asm逆向的,之后有做到会接着补充,嗯~ o( ̄▽ ̄)o
Comments