lab09-01
1这个程序就是第三章lab03-04那个会删除自身的程序,之前我们没有分析完,现在继续
想要解决的是正确安装程序,因为他会自我删除,只有避免了他的自我删除我们才能继续分析他的功能
IDApro打开程序,程序要求参数要大于1,这就说明我们需要输入lab09-01.exe "一些参数"这样的方式才能启动程序,为什么呢,因为如果不跳转,那么下面不管是在jz处是否跳转结果都会跳转到下面这个地方直接结束程序.(未安装时候才是这种情况)
区别就是sub401000在找一个注册表项(实际上我在xp和win7下跟踪发现他永远都是找不到的,也就是返回值永远是0,那么他就会跳转到402B13,再执行402410删除自身)
还记得第三章的分析的话有下面截图,下面的几个参数/c del >>null cmd.exe你们都会在402410函数里面找到,也就是说402410将会删除程序自身.
好了现在我们要找找到底需要什么参数才能让程序运行,最后一个参数(我们的目标就是知道这个参数是啥)被传给sub_402510函数作为参数,看来需要跟踪进这个函数才能解开秘密
开头这一段是在看参数的字节数是不是4,这个自己体会一下,或者再ollydbg里面跟踪运行一下就知道他在干嘛,经验丰富的话一般会比较快的意识到他在做什么,没经验也不能理解这段代码,好了现在我们知道参数是四个字符
接着往下走,看关键cmp再联系上下文知道比较的双方是什么,你就会很快明白在做什么(这里的a原本是'61h',被我标记为a了这样比较明了),很明显edx是参数的第一个字节,他在和a比较,那就是说第一个字符是a
接着cmp是eax和1比较,那么eax是啥?联系上文你会发现,eax是参数的第二个字符减去参数的第一个字符的值,也就是说第二个字符是b
继续看这段代码,做了一系列事还有乘法,其实你会发现她其实就是再看第三个字符是不是c,并不复杂
最后一个字符,很可能就是d了,实际上你仔细分析会发现确实如此
好了分析到这里,我们发现程序要启动需要命令 Lab09-01.exe abcd,我们用ollydbg验证一下,可以看到402510函数正确返回1,这里我们可以回答一下第三问,把jnz改成jmp即可不需要特定密码都能通过.
还没完,接下来下面代码是一样的不过一个是再ollydbg一个是IDApro打开的,你会发现他需要第三个参数-in(安装可能推测),那么没有呢他会怎么办?一路跟踪发现他会考虑是否有参数-in -re -c -cc这是个参数,如果都没有还是会删除自身(这波结论可以很容易得出,自己用ollydbg'或者idapro跟踪一下即明白)
那么有参数-in他会做什么?(很可能安装程序猜测)关键函数他的参数被标记为一个服务名,看看这个函数做什么,他实际上就调用两个函数,再结合实际代码会知道,他是要得到完整路径(getmodulefilename),然后得到文件名Lab09-01.exe(splitpatch)作为服务名返回.
好了,现在得到服务名了,接着做什么?(猜测可能是安装程序为一个服务),看来关键代码再函数402600了
前面一串先不管,没必要陷入细节,我们看到他打开服务控制管理器,然后打开一个服务(服务名就是程序名Lab09-01),成功也就是服务存在那就把他设置成自启动,否则就创建这个服务,并设置为自启动,然后结束,这一波结论的得出其实不难几个关键的函数已经说明问题(如果你熟悉这些函数的话)
注意这里的关键参数dwstarttype
从创建服务的参数我们可以知道,恶意程序被复制到system32目录下了.
还没完,在服务成功注册或者被设置为自启动后,他还会创建一个注册表项(SOFTWARE\Microsoft \XPS)在函数sub_401070里面
并且设置Configuration键值为图中数据区字符串.
补充:这里有个发现比较如果参数个数不是3的话,我们可以指定第四个参数作为服务名字
2 现在看看命令-re做什么,我们可以看到程序的结构和-in很像,他也可以指定第四个参数作为要删除的服务名称,代码的关键函数调用deleteservice告诉我们他是删除程序自身.
3看-c命令,发现他一共需要七个参数,然后调用401070这个函数,这个函数我们之前分析过看看之前对这个函数的调用,我们不难知道-c是对键值configuration的修改操作.
4再看看最后的-cc命令,看到这种格式我们很容易联想到输出,实际操作也证明这一点,-cc就是打印configuration这个键值
还没完,如果程序已经安装以服务方式运行,没有那些参数,那么他会运行sub_402360函数,然后依据函数sub_401E60返回的值做相应的操作:SLEEP UPLOAD DOWNLOAD CMD NOTHING这五种操作,所以先看看401E60函数,我们猜测这可能是接受远端发来命令的函数,那么一定有网络相关操作,在函数sub_401AF0里面有一系列网络函数操作,其中调用401640是一系列网络初始操作,再往下会发现send和recv操作,至于上面五种操作具体做什么就不一一具体分析,因为从名字上就可以知道分别是,睡眠,下载文件到本地,读取文件到远端主机,用cmd.exe运行shell命令,和什么都不做
分析一下各个命令参数形式sleep的参数得自strtok第二次分割得到的值也就是说格式为SLEEP time
看UPLOAD的关键函数调用有三个参数,name是主机名(ollydbg可以看到就是http://www.practicalmalwareanalysis.com),文件名和端口是命令指定,格式UPLOAD port filename
DOWNLOAD和UPLOAD很类似就不说了看看CMD,下图是在创建并运行子进程 等同于cmd.exe /c command形式运行cmd,其中arg_0是_popen的参数,所以
还没完,CMD还需要在函数401790里面读取标准输出内容然后从指定端口发送给远端主机
在loc_401B35显示恶意程序最初是构造HTTP/1.0 GET请求,则可以作为网络特征
代码分析到现在,其实已经差不多了,对于恶意代码我们已经基本掌握他的目的功能,实际上我们忽略了一些具体的细节比如对接收到的数据包的具体解析以得到具体命令我们就没有分析,还有一些内存操作也没有具体分析,但是我们发现这并不影响我们了解并掌握这个恶意代码的具体流程,所以这就是为什么我们常说不能迷失在代码中不能过分关注细节,我们的目的很明确就是了解恶意代码的目的和功能,我们要以最有效的手段来达到目的,当代码量很大的时候这点尤为重要,然后就是ollydbg和IDApro的使用,实际上在分析上述代码的时候我少使用ollydbg,基本使用IDApro来完成分析,但是我发现ollydbg必不可少,比如在分析参数name的时候我在IDApro里面找了半天也没有找到证据说这个name就是http://www.practicalmalwareanalysis.com尽管我坚信他就是这个,但是没有证据,然而我用ollydbg却可以轻松的看到name就是这个网址,所以在分析恶意代码时候两者缺一不可,IDApro很强大但是,他毕竟主要是静态分析,有时候很难的静态分析,我们只需要ollydbg就可以很轻松的完成分析,所以如何取舍才能更快的完成分析也很重要.
lab09-02
1除了函数名有意思的字符串都在这里
2在xp下运行啥反应也没有,用process monitor看一下都做了啥,只有一些文件操作和注册表操作
3只能看代码了,首先得到程序完整路径名,然后用strrchr函数得到最后一个'\'后面的字符也就是函数名Lab09-02.exe,然后和var_1A0做比较,相等程序才继续运行,否则跳转到4013D6就结束程序了,现在看看var_1A0是啥ocl.exe,所以程序要改名为ocl.exe程序才能正确运行
4对比发现,local.124的值被赋值为"F\x06\x16TB\x05\x12\x1BG\f\a\x02]\x1C",而他又被作为参数传给401089
5一个是字符串1qaz2wsx3edc,另一个就是上面提到的
6域名是上面sub_401089的返回值,用ollydbg跟踪发现是用上面的第一个参数和第二个参数异或(这么说不太准确不过如果你有自己用ollydbg走一遍,就明白我说的意思)32次得到这个熟悉的网址www.practicalmalwareanalysis.com
8这是运行了cmd子进程.然后他的输入输出错误都被赋予了套接字s(s被作为参数传给401000函数),则构成了一个反向shell
注意到程序运行后并没有cmd窗口猜测被隐藏了
看下运行结果apatedns被我设为本地,很明显反向shell成功
lab09-03
1对比idapro的字符串和ollydbg的查看可执行模块,可以推测,程序导入了DLL1,DLL2,kernel32.dll和netapi32.dll动态user32.dll和dll3
2全部都是10000000
3dll1是10000000而dll2是390000,dll3是3f0000
4dll1就一个导出函数dllprint,打印如下信息,其中400每次都会变化,因为他是lab09-03的ID
因为在dll1main里面调用getcurrentprocessid得到程序id然后给了10008030,后面又被作为参数传给10001038打印出来
5dll2的主函数创建temp.txt文件然后将句柄给了1000B078,然后函数dllreturn将这个句柄返回作为参数给了我writefile
60llydbg查看知道第二个参数是local.7那么在上一个call local.4处被作为参数传递,那么很有可能这个参数的值来自这个函数的操作,跟随进函数查看,果然被赋值为DLL3.003FB0A0
7dll2的神秘数据是文件temp.txt的句柄
dll3的神秘数据是ping www.malwareanalysisbook.com的宽字节在内存中的位置
8如图,选中manual load然后再ollydbg中查看dll2的加载基地址我这边是390000