
一起学习 代码审计、安全开发、web攻防、逆向等。。。
私信联系

1.IDA Pro
IDA Pro是一款交互式的,可编程的,可扩展的,多处理器的,
交叉Windows或Linux WinCE MacOS平台主机来分析程序,
被公认为最好的花钱可以买到的逆向工程利器。
IDA Pro已经成为事实上的分析敌意代码的标准并让其自身迅速成为攻击研究领域的重要工具。
它支持数十种CPU指令集其中
包括Intelx86,x64,MIPS,PowerPC,ARM,Z80,68000,c8051等等。
服务器:Windows 7
辅助工具:IDA Pro

将会分析 exe文件。先来看看要求解答的问题
Q1.程序初始化请求的URL是什么?
Q2. User-Agent 域是如何产生的?

Q3.初始化请求时,程序在内存页中查找什么?
Q4.程序如何处理它从页中提取的信息?

首先IDA载入分析,从头到尾稍微看下main
在0040115a遇到了第一个对抗反汇编技术

因为esp值是非0的,所以test指令返回结果一定是非零值

那么下面的jnz指令的跳转是永远成立的
其跳转的目的是40015e+1
也就是jmp指令中间的位置,这是有问题的,
而且IDA将跳转的位置标记为红色,也能说明这里是不正常的
将光标定位40115e,按d键,将这个指令变为数据


然后光标定位到40115f,按c键转为代码


这样就正常了。
继续往下,在4011d0看到了对抗反汇编的技术

这里通过xor给eax赋0,下面的jz指令跳转是永远成立的

jz的目的第4011d4处的call目的地址同样是红色的,说明也是不正常的
光标定位到4011d4,按d键转数据


然后定位到4011d5,按c键转代码


之后都是同样的处理,结果如下

继续往下,在401215处也存在对抗反汇编的技术

可以option->general如下设置,用于显示出机器码

如下所示

这是一个双字节的jmp指令。跳转目标是它的第二个字节

按d键转为数据


光标定位到00401216,按c键转为代码

继续往下,在401269处存在对抗反汇编技术

这里的jz和jnz指令都是跳转到同一个地址,说明命中目标代码不取决于零标志位的置位与否
将光标定位到跳转的目标,也就是0040126d,按d键转为数据


光标定位0040126e,按c键,转为代码

继续往下,在4012e6位置存在对抗反汇编技术

这里的jz跳转的目的地是4012e8,是向上跳转,跳到mov指令中间的位置。
这不是正常的跳转,而且和我们之前看到的向下跳转也是不同的
光标定位到4012ee,按d键转为数据


定位到4012ef,按c键转为代码

定位到4012e6,按d键转为数据


定位到4012e8按c键转为代码


至此,main函数中所有对抗反汇编的地方都被我们调整回来了。
不过可以看到,还存在一些多余的db字节,

我们需要将其转换为nop指令(0x90),这样才能构造出一个函数
替换nop,使用脚本就可以自动化进行
脚本内容如下

#include
static main()
{
auto ea = ScreenEA();
PatchByte(ea,0x90);
}
注意文件后缀名为idc
来测试一下,定位到0040115e,这里有多余的db字节

然后file->script file

选中test.idc,点击打开即可
此时已经被修改为90h了

其他地方也是同样如此







这样就全部修改完毕了,接着选中全部main函数
从00401000到0040130e
然后按p键,再按空格键,就可以图形化地查看生成的函数




在InternetOpenUrlA前调用了sub_401386,跟入


可以看到是在将字符拷贝到栈空间里

可以将这些16进制通过按r键进行转换为字符


可以看到往栈上拷贝的字符组成的字符串其实是一个网址
http://practicalmalwareanalysis.com/bamboo.html
Q1.程序初始化请求的URL是什么?
A1.程序第一个请求的URL是http://www.practicalmalwareanalysis.com/bamboo.html。
返回上层函数
我们就知道了InternetOpenUrlA就是尝试访问这个网站
为了知道user-agent,我们来分析InternetOpenA

其第一个参数lpszAgent其实就是user-agent
其值edx来自name,往上回溯

可以看到是gethostname的返回值保存在name中。
所以我们可以认为user-agent的字符串就是主机名
我们f5查看伪码继续分析



将case里的数字转为字符,更直观一点

可以看到是一个for循环。
for循环的作用就是将name字符串中的每个字符进行修改:
如果是Z则修改为A,如果是z则修改为a,
如果是9则修改为0,如果不是这三种情况,
则自增,检查下一个
Q2. User-Agent 域是如何产生的?
A2. User-Agent 字符串由hostname中
每个字母和数字加1组成(Z和9对应的是A和0)。
程序使用InternetOpen初始化,然后使用InternetOpenUrlA打开一个网址

然后是InternetReadFile将数据下载到一个本地缓冲区

缓冲区包含的数据是第二个参数,上图中已经被IDA标记为Buffer
在004011DA又出现了Buffer

上图中调用了strstr查找一个大字符串中的子串,

这里就是在缓冲区Buffer中查找字符串Bamboo::,
Buffer里包含从原始的url中提取的所有数据。

如果查找成功,则eax会保存该子串在Buffer里首次出现的位置,
通过mov指令赋给了Str

Q3.初始化请求时,程序在内存页中查找什么?
A3.程序在它请求的网页中查找字符串Bamboo::。

上图又是调用了strstr,用来搜索::,如果找到了,

则将地址保存在eax里,而00401212又将0赋给了eax
其实也就是说将::的第一个:赋0,或者说赋NULL,
用于终止Bamboo::和::之间的字符串
0040123e,ecx+8,其实就是Str+8,而Bambo:长度就是8,

那么这里的作用就是让指针跳过Bambo:,指向后面的内容

之后是调用InternetOpenUrlA,其第二个参数就是要打开的url

所以我们就知道了,Bamboo::和尾部冒号之间的数据的目的,
就是程序要下载的一个网址

调用InternetReadFile将文件保存在文件里


文件名称保存在ecx,而ecx来自于Filename,往上回溯

Filename来自eax,而eax是sub_40130f的返回值

跟入该函数

同样有拷贝字符的操作,按r键转换

这里合在一起就是AccountSummary.xls.exe
这就是文件名称,我们通过InterReadFile下载的文件就是保存在这里
回到上层函数,继续往下分析

调用ShellExecute函数启动文件

之后程序就退出了。

Q4.程序如何处理它从页中提取的信息?
A4. 除了搜索字符串Bamboo外,
程序还查找一个额外的::,它被转换为一个NULL结束符。
Bamboo与结束符之间的字符串被下载到一个名为AccountSummary.xls.exe的文件中,
下载完后, 程序运行它
配套学习资源
1.《恶意代码分析实战》
了解、学习恶意代码对抗反汇编的技术。
识别恶意代码采用的反汇编技术,并针对性地进行破解,
结合ollydbg进行分析;
在此过程中我们还会使用idc脚本辅助我们的分析;
此外,我们还将学习如何破解程序的加密原理。
恶意代码分析实战
本科/专科信息安全专业
计算机网络、操作系统
1.IDA pro
IDA Pro是一款交互式的,可编程的,可扩展的,多处理器的,
交叉Windows或Linux WinCE MacOS平台主机来分析程序,
被公认为最好的花钱可以买到的逆向工程利器。
IDA Pro已经成为事实上的分析敌意代码的标准并让其自身迅速成为攻击研究领域的重要工具。
它支持数十种CPU指令集其中包括Intelx86,x64,MIPS,PowerPC,ARM,Z80,68000,c8051等等。
2.OllyDbg
一个反汇编工具,
又叫OllyDebug,一个新的动态追踪工具,
将IDA与SoftICE结合起来的思想,Ring 3 级的调试器,
己代替SoftICE成为当今最为流行的调试解密工具了。
同时还支持插件扩展功能,是目前最强大的调试工具。
服务器:Windows 7
辅助工具:IDA pro,Ollydbg
本次实验我们将会分析 exe文件。先来看看要求解答的问题
Q1.恶意代码怎样被初始化调用?
Q2.恶意代码都做了什么?
Q3.恶意代码使用了什么URL?
Q4.恶意代码使用了什么文件名?
首先使用IDA分析
查看imports窗口

看到了可疑函数URLDownloadToFile,WinExec

再通读一下main


调用上图的函数给当前进程创建快照

而后是一个循环结构

里面调用了ProcessFirst

对应地,在循环的下面调用了Process32Next
其组合使用可以用于列举当前进程
如果真是这样的话,我们发现的那些导入函数就没有意义了。
我们回到main开始处

前两条指令将40000h和0x148c进行 或操作,
结果为0x0040148c,将其保存在eax
之后该值赋给ebp+4

打开od,直接跳到40100c


然后下断点,执行过来


接着单步执行到401016

此时ebp值如上所示,我们在堆栈窗口中跟随

ebp+4是0012ff50
可以看到是指向main函数的返回地址
那么我们就清楚了,
这三条指令的作用就是将main函数返回地址覆盖成0040148c,
这样就可以执行0040148c后的指令了
Q1.恶意代码怎样被初始化调用?
A1.通过覆盖main函数的返回地址,初始化调用恶意代码。
回到IDA直接跳到0040148c

如下所示

可以看到是一段孤立的代码,IDA没能将其识别为函数的一部分
option->general显示机器码,方便分析

注意到00401494处存在对抗反汇编的技术

其上一条的指令给eax赋0,使用jz会一直成立。
跳到401496+1,即401497,
也就是5字节jmp指令的第二个字节,这是不正常的
光标定位到00401496,按d键转为数据
定位到00401497,按c键转为代码

正确反汇编后的结果如上
继续分析

在004014b3看到了printf,用于打印上面的字符串,
不过这是永远也不会执行的

因为在其之前,可以看到创建了一个异常处理例程。xor指令会给ecx赋0,而div则会将ecx做除数,从而引发除零异常。此时就会跳到4014c0

而我们看到IDA没有将此处的数据识别为代码,而是将其作为DWORD进行表示。
光标定位到004014c0,按c键转为代码

继续往下分析

004014c0到004014d7用于从链中摘除异常处理例程,
并从栈中删除了记录。

004014d7存在对抗反汇编技术,IDA将其目的地址也标记为红色
光标定位到004014d7,按d键

光标定位到004014d8,按c键转为代码

接着继续分析

这里调用了URLDownloadToFile

其第二个、第三个参数分别为url,文件名
而对应在上图,则是unk_403010,unk_403040
跟入任一个可以看到

这些数据不是以ascii文本显示的
004014eb,004014f8
两处调用sub_401534时
注意到传入的就是unk_403010,unk_403040
所以我们推测,sub_401534是解密函数

跟入该函数

这里一个循环结构,最重要的就是箭头所指的xor语句,
将缓冲区中的每个字符与0ffh异或从而修改他们
知道了解密的原理,我们就可以编写一个脚本帮助我们解密内容了

file->script file,选择该脚本,解密后如下所示

