二进制分析
未读逆向工程开源引擎框架
Capstone, Keystone, Unicorn, Qemu 以及 QiLing 等工具
汇编与反汇编
Capstone
新加坡南洋理工大学团队在 Blackhat USA 2014 上发布的一个反汇编引擎
Capstone 反汇编引擎 官网The Ultimate Disassembly Framework – Capstone – The Ultimate Disassembler (capstone-engine.org)
项目主页:https://github.com/aquynh/capstone
多平台 Windows、*nix
多架构,例如 Arm、Mips 和 x86
支持 C/Python 接口
Keystone
新加坡南洋理工大学团队在 Blackhat USA 2016 上发布的一个汇编框架
Keystone 汇编框架 官网Keystone – The Ultimate Assembler (keystone-engine.org)
项目主页:https://github.com/keystone-engine/keyst ...
ASCII码表
ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)是一套基于拉丁字母的字符编码,共收录了 128 个字符,用一个字节就可以存储,它等同于国际标准 ISO/IEC 646。ASCII 规范于 1967 年第一次发布,最后一次更新是在 1986 年。
ASCII编码范围0x00-0x7F,即十进制的0-127,定义了128个单字节字符。它包含了 33 个控制字符(具有某些特殊功能但是无法显示的字符)和 95 个可显示字符(数字、字母、符号)。国标码GB18030、国际码Unicode均兼容ASCII编码。
第一部分:ASCII非打印控制字符,0~31及127(共33个)是控制字符或通信专用字符
第二部分:ASCII打印字符,32~126(共95个)是字符(32sp是空格),其中48~57为0到9十个阿拉伯数字;65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。
第三部分:扩展ASCII打印字符,后128个称为扩展ASCII码,目前 ...
二进制分析
未读1.Acid burn
寻找MessageBox
我们的目的是找到序列号或者序列号的计算规则,分析的目标是找到正确的目标函数,再分析函数的功能。首先用onlydbg加载并调试程序,点击check it,弹出窗口,我们要去定位窗口调用的位置,因为我们需要依据这个MessageBox定位判断函数;
搜索所有模块间的调用,
找到MessageBoxA,在所有调用设置断点
我们可以分析出弹窗调用发生在地址0x42A1A9 call <jmp.&user32.MessageBoxA> ; \MessageBoxA
追溯判断逻辑
保留这个断点,再次运行程序,点击check it! 可以发现在右下角堆栈处找到最近一条Return语句:
0019F704 |0042FB37 返回到 Acid_bur.0042FB37 来自 Acid_bur.0042A170
右键Follow in Disassm…(反汇编跟随),
如下代码:
12345678910111213141516171819202122232425262728290042FACD |. E8 ...
二进制分析
未读2.Afkayas1
运行程序,崩溃,缺少msvbvm50.dll,程序无法运行。没办法,上网上搜索一个,放到程序同一级目录,再次运行,OK。
输入name和serial,
弹出对话框,不要点击确定也不要关闭,我们去堆栈查看调用,MsgBox的位置,显示调用;
可以看到,再往上面一点就看到可读的字符串了,程序的主要逻辑就在这附近。
断点调试,可以发现序列号AKA-585291
此位置,ECX获得了用户名,
0x8EE4B就是585291,计算过程是
加上前缀AKA-
OllyDbg是一个32位的动态调试器,在平常做逆向的题中用的比较多,下面用bugku一个简单的例子Eazy-Re来介绍一下OllyDbg的使用。
首先打开程序,看一下是干什么的,他提示你输入flag,这里我随便输入几个字母,提示我不正确。
我们用OD打开程序,会看到下面的这个样子,如果没接触过OD的人可能直接被劝退了,这是啥乱七八糟的,别急,一点点来看,打开程序后会出现5个面板(我更喜欢称之为窗口),分别是反汇编窗口,信息窗口,寄存器窗口,数据窗口,栈窗口。
反汇编窗口
反汇编窗口显示被调试程序的代码,总共有4列,分别是地址,十六进制的机器码,反汇编代码和注释。在最后一列注释中显示了相关API参数或运行简表,非常有用。
在反汇编窗口的列中,默认情况下,双击可以完成如下操作:
地址列:显示被双击行地址的相对地址,再次双击返回标准地址模式
十六进制机器码列:设置或取消断点,对应的快捷键是F2
反汇编代码列:调用汇编器,可以直接修改汇编代码,对应的快捷键是空格键。
注释列:允许增加或编辑注释,对应的快捷键是;。
信息窗口
在进行动态跟踪时,信息窗口将显示与指令相关的各寄 ...
二进制分析
未读3.Afkayas2
同1时类似,依旧是找到MsgBox函数,右键显示调用;
找到的序列号为1600318,完全没有章法;
直接单步运行,记录寄存器变化;
用户名:itachi,长度6,第一个字符ascii码为0x69,
第一次计算:len(s)*0x15B38 + ascii(first(s)),值为533433
533433-> 533435->1600303->1600318
第一次浮点计算
12345678910111213141516171819202122232425262728293031323334004082D7 . FF15 18B14000 call dword ptr ds:[<&MSVBVM50.__vbaHresu>; msvbvm50.__vbaHresultCheckObj004082DD > 8B8D 58FFFFFF mov ecx,dword ptr ss:[ebp-0xA8]004082E3 . 8B55 E8 mov edx,dword ptr ss:[ebp-0 ...
利用缓冲区溢出来执行任意代码
1、缓冲区溢出示例
缓冲区溢出(buffer overflow):最有名的漏洞之一,输入的数据超出了程序规定的内存范围,数据溢出导致程序发生异常。
eg.
12345678#include <string.h>int main(int argc, char *argv[]){ char buff[64]; strcpy(buff, argv[1]); return 0;}
这个程序为 buff 数组分配了一块 64 字节的内存空间,但传递给程序的 参数 argv[1] 是由用户任意输入的,因此参数的长度很有可能会超过 64 字节
因此,当用户故意向程序传递一个超过 64 字节的字符串时,就会在 main 函数中引发缓冲区溢出。
2、让普通用户用ROOT权限运行程序
setuid :让用户使用程序的所有者权限来运行程序
一个 sample
1234567891011121314#include <unistd.h>#include <sys/types.h>int main(int a ...
线性扫描( linear sweep)和递归下降( recursive descent)是两种最主要的反汇编算法。
线性扫描反汇编
线性扫描反汇编算法采用一种非常简单的方法来确定需要反汇编的指令的位置:一条指令结束、另一条指令开始的地方。
因此,确定起始位置最为困难。常用的解决办法是,假设程序中标注为代码(通常由程序文件的头部指定)的节所包含的全部是机器语言指令。反汇编从一个代码段的第一个字节开始,以线性模式扫描整个代码段,逐条反汇编每条指令,直到完成整个代码段。这种算法并不会通过识别分支等非线性指令来了解程序的控制流。
进行反汇编时,可以维护一个指针来标注当前正在反汇编的指令的起始位置。在反汇编过程中,每一条指令的长度都被计算出来,并用来确定下一条将要反汇编的指令的位置。为此,对由长度固定的指令构成的指令集(如 MIPS)进行反汇编有时会更加容易,因为这时可轻松定位随后的指令。
线性扫描算法的主要优点,在于它能够完全覆盖程序的所有代码段。线性扫描方法的一个主要缺点,是它没有考虑到代码中可能混有数据。
GNU 调试器( gdb)、微软公司的 WinDbg 调试器和 objdump ...
逆向与反汇编工具
1 分类工具
绝不要根据文件的扩展名来确定文件的类型。
1.1 file
file 命令是一个标准的实用工具,大多数*NIX 风格的操作系统和 Windows 下的 Cygwin①或MinGw②工具都带有这个实用工具。file 试图通过检查文件中的某些特定字段来确认文件的类型。
file 能够识别常见的字符串,如#!/bin/sh( shell 脚本文件)或( HTML 文档)。但是,识别那些包含非 ASCII 内容的文件要困难得多,在这种情况下, file 会设法判断该文件的结构是否符合某种已知的文件格式。多数情况下,它会搜索某些文件类型所特有的标签值(通常称为幻数③)。下面的十六进制表列出了几个用于判断常见文件类型的幻数。
幻数是一些文件格式规范所要求的特殊标签值,它表示文件符合这种规范。
1.2 PE Tools
PE Tools①是一组用于分析 Windows 系统中正在运行的进程和可执行文件的工具。
1.3 PEiD
PEiD①是另一款 Windows 工具,它主要用于识别构建某一特定 Windows PE 二进制文件所使用的编译器,并确定任何用于模糊 ...
二进制分析
未读目标是解析flag,为一个序列号
查看PE文件,可见是一个win32程序,32位exe,并且加壳了,加壳工具是tElock,首先脱壳得到脱壳后的文件。
用IDA反编译:
分析DialogFunc,获取最终的flag;
此处应该是获取了两个输入,用户名和序列号。
DialogFunc中可分析出由一个子函数控制着序列号正确与否,接着去分析sub_401610,该函数接受的参数是lpString,也是输入的序列号,尝试去找到该序列号的正确匹配结果;
查看sub_401610函数的伪代码,其中又调用了其他函数过程,挨个分析吧;
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131 ...