这次要用到脱壳和反编译,用到exeinfoPE(脱壳)和IDA(反编译)
二者下载地址为
此外,还需记住一些IDA的快捷指令
F2:下断点
F3:打开程序
F4:运行到当前光标处(可应用在跳出 循坏)
F7:单步步入(进函数)
F8:单步 步过
F9;运行
F10:打开反汇编选项菜单快捷键
F12:暂时停止
Ctrl+F2:重新开始
Art+F2:结束跟踪
Shift+F2:打开附加选项窗口
Shift+F4:打开条件对话窗
Shift+F7:与F7相同,但是如果被调试程序发生异常而中止,调试器会首先尝试步入被调试程序指定的异常处理
Ctrl+F7:自动步入,在所有的函数调用中一条一条地执行命令,断点或异常时,自动 停止
Shift+F8与F8相同,但是如果被调试程序发生异常而中止,调试器会首先尝试步过被调试程序指定的异常处理
Ctrl+F8:自动步过,一条一条的执行命令,程序到达断点,或者发生异常时,自动步过过程都会停止
Shift+F9:与F9相同,但是如果被调试程序发生异常而中止,调试器会首先尝试执行被调试程序指定的异常处理
Ctrl+F9 :执行直到返回,跟踪程序直到遇到返回,在此期间不进入子函数也不更新CPU数据。因为程序是一条一条命令执行的,所以速度可能会慢一些。按Esc键,可以停止跟踪。
Alt+F9:执行直到返回到用户代码段,跟踪程序直到指令所属于的模块不在系统目录中,在此期间不进入子函数也不更新CPU数据。按Esc键,可以停止跟踪。
Ctrl+F11:Run跟踪步入,一条一条执行命令,进入每个子函数调用,并把寄存器的信息加入到Run跟踪的存储数据中。Run跟踪不会同步更新CPU窗口。
Ctrl+F12 :Run跟踪。步过,一条一条执行命令,但是不进入子函数调用,并把寄存器的信息加入到Run跟踪的存储数据中。Run跟踪不会同步更新CPU窗口。
Art+C:快速回到主界面
Alt+B:显示断点窗口
Alt+E:显示模块窗口
Art+L:显示记录窗口
Alt+M:显示内存窗口
Alt+O:显示调试选项窗口
Alt+K:显示呼叫堆栈
Ctrl+E:编辑机器码
Ctrl+G:输入跟随地址
Ctrl+N:查找名称标志,选择你要下断的内容
Ctrl+S:打开查找命令次序窗口
Ctrl+P:显示补丁窗口
Ctrl+F9:返回到跟踪
Ctrl+F8:自动步进扫描,按F12可停止
Ctrl+F7:同上,功能略有不同
Ctrl+F6:回到OL主窗口
一
reverse easyre
以PE打开,脱壳可知无壳
再以IDA打开,使用shift+F12,可以直接看到flag
reverse 1
同样以PE打开
无壳,64位,以IDA64打开,同样shift+F12,
看到这个可疑,用CTRL+x进入原本的图示处,再选中F5反编译,查看伪代码,并进行双击指代flag的数组Str2可以找到其位置,分析代码,字符数组,ascll码值,o换为0,得到flag
reverse 2
脱壳
无壳,64位,IDA64,操作同上,
依旧有类似的right flag,同上查看,
双击flag可以找到位置,分析代码,字符数组与ascll值,i和r换为1,得到flag
二
字节与端序
1.机器字长,是指CPU一次能处理数据的位数,通常与CPU的寄存器位数有关。
2.指令字长,计算机指令字的位数。指令字长取决于从操作码的长度、操作数地址的长度和操作数地址的个数。不同的指令的字长是不同的。
3.存储字长,是一个存储单元存储一串二进制代码(存储字),这串二进制代码的位数称为存储字长。
4.数据字长:计算机数据存储所占用的位数。
通常早期计算机:存储字长 = 指令字长 = 数据字长。故访问一次便可取一条指令或一个数据,随着计算机应用范围的不断扩大,三者可能各不相同,但它们必须是字节的整数倍。
端序
大端:数据的高字节储存在内存的低地址中,低字节储存在内存的高地址中。
小端:数据的低字节储存在内存的低地址中,高字节储存在内存的高地址中。
汇编指令
add指令
add 寄存器,数据 例:add ax,8
add 寄存器,寄存器 例:add ax,bx
add 寄存器,内存单元 例:add ax,[0]
add 内存单元,寄存器 例:add [0],ax
sub指令
sub 寄存器,数据 例:sub ax,8
sub 寄存器,寄存器 例:sub ax,bx
sub 寄存器,内存单元 例:sub ax,[0]
sub 内存单元,寄存器 例:sub [0],ax
mul乘法指令
两个相乘的数,或者全为8位,或者全为16位;
若为8位,一个默认放置于AL中,另一个置于8位寄存器或内存单元中,结果默认放置于AX中;
若为16位,一个默认放置于AX中,另一个置于16位寄存器或内存单元中,结果高位默认置于DX,低位置于AX;
无符号数乘法指令: mul 通用寄存器/内存单元
有符号数乘法指令: imul 通用寄存器/内存单元
div除法指令
【在除号前面的是被除数,除号后面的是除数。】
除法分为8位和16位的运算,有被除数和除数
除数: 有8位和16位两种,在一个寄存器或内存单元中
被除数: 默认放置在AX或DX和AX中,除数为8位,被除数为16位,默认在AX中放置;
若除数为16位,被除数为32位,在DX和AX中放置,DX存放高16位,AX存放低16位;
结果: 如果除数为8位,则AL存储除法操作的商,AH存储除法操作的余数
如果除数为16位,则AX存储除法操作的商,DX存储除法操作的余数
无符号数除法指令: div 通用寄存器/内存单元
有符号数除法指令: idiv 通用寄存器/内存单元
inc(自增)(即C语言++)
只有一个操作数:寄存器或存储单元
对操作数加1(增量)再将结果返回原处,用于计数器和地址指针的调整
push 寄存器:将一个寄存器中的数据入栈
push 段寄存器:将一个段寄存器中的数据入栈
push 内存单元:将一个内存单元处的字入栈
CMP(比较)
cmp相当于是sub指令,不保存结果,仅对相应标志寄存器进行修改。
Test
作用与and指令相似,进行逻辑于运算,但不会保存结果,Test命令的两个操作数不会被改变。运算结果在设置过相关标记位后会被丢弃,仅对标志寄存器【ZF】进行修改
pop 寄存器:用一个寄存器接受出栈的数据。
pop 段寄存器:用一个段寄存器接受出栈的数据
pop 内存单元:出栈,用一个内存字单元接收出栈的数据