本章简单介绍了一下OD的使用,感觉没啥好记的,就不写笔记了,直接写作业吧
作业
Lab 9-1:
首先,main函数里先判断了参数个数,如果参数个数为1,就继续执行,进入函数sub_401000,然后要么自毁(返回0),要么执行一个函数然后直接退出,如果参数个数不为1,就跳转执行
-in参数分支
首先是参数不为1跳转:首先是获取最后一个参数,进行验证,应该是个密码,跟进去逆出来密码是写死的abcd,如果密码不对也会执行自毁,如果密码对了,就获取第二个参数,看是不是-in
字符串,如果不是就进行下一个判断,如果是就判断一下是不是总共就3个参数,如果是,就获取当前文件名到ServiceName变量里,如果不是就跳走
,接下来两个分支分别是把获取到的文件名当作参数或者把第三个命令行参数当作参数去调用sub_402600,这个参数是个字符串
接下来看看sub_402600函数:(字符串函数内联在反汇编里看着太长了)直接看f5吧,这里打开SCM,打开服务,如果服务不存在,就创建一个服务,然后把拼接了字符串:%SYSTEMROOT%\\system32\\filename.exe
作为服务的程序路径,然后把当前程序复制到C:\\Windows\system32\
目录下,最后执行函数sub_401070的结果作为返回值
sub_401070函数:
首先是打开或创建注册表的键,然后设置一个项的值
设置的值是:
就是参数拼接起来的样子,到此这个函数分析结束了,接下来返回到主函数后,会直接jmp到程序结束的位置
到此,多参数情况的-in参数分支结束了
-re参数分支
接下来是判断参数是不是-re
,整体结构流程和刚才一样,两种情况,后面都执行相同的函数,然后返回
sub_402900函数:这里就很简单了,打开SCM服务管理器,然后删除当前注册的服务,然后删除文件,删除注册表,是卸载恶意服务的功能
-c参数分支
这里要7个参数,拿中间4个参数调用函数sub_401070
sub_401070函数:4个参数拼接起来,打开注册表,修改键值,这四个参数就是之前写入注册表类似的值
-cc参数分支
看到这里的printf和4个缓冲区参数的函数,不用看也能猜到功能了,就是把注册表的值的那4个部分取出来打印
main函数带多个参数的情况分析完成了,接下来看看只有一个参数是什么情况:
后门分析
只有一个参数的时候会进入sub_401000函数:具体是在做注册表相关的操作:打开注册表键:HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft \\XPS
,打开成功就查询项Configuration
的值,如果成功返回1,失败返回0。
如果返回的是1说明注册表相关的项是存在的,然后就会执行sub_402360函数,这个函数会调用sub_401280再次检查注册表,检查通过后,进入sub_402020函数:
进去后可以很明显的看到几个字符串:SLEEP、UPLOAD、DOWNLODAD等,在那之前,先调用了一个sub_401E60函数层层跟进入,很快就发现了网络连接迹象:
这里就不深入分析了,参数是安装卸载的时候用的,当无参数且安装过后的时候,就会开始接收信息,然后根据接收的信息执行相应的操作,是个完整的后门程序
-
如何让代码安装自身?
通过参数:
-in
-
这个恶意代码的命令行选项是什么?它要求的密码是什么?
命令行选项有4个:
-in -re -c -cc
密码是abcd
-
如何利用OllyDbg永久修补这个恶意代码,使其不需要指定的命令行密码?
在验证密码函数那里直接给eax赋值为1然后返回
-
这个恶意代码基于系统的特征是什么?
注册表:
SORFWARE\\Microsoft\\ XPS
,文件:C:\\Windows\system32\filename.exe
-
这个恶意代码通过网络命令执行了哪些不同的操作?
SLEEP UPLOAD DOWNLOAD CMD
命令 -
这个恶意代码是否有网络特征?
有
Lab 9-2:
-
在二进制文件中,你看到的静态字符串是什么?
静态字符串没啥特别的,也没看到书上提到的cmd,可能我的strings识别规则不太一样吧
-
当你运行这个二进制文件时,会发生什么?
什么也没发生:
进去以后会获取文件名进行判断,如果不是
ocl.exe
就会直接返回,什么也不执行 -
怎样让恶意代码的攻击负荷(payload)获得运行?
改名为ocl.exe即可,或者修改跳转逻辑,前者比较简单
-
在地址
0x00401133
处发生了什么?这里的字符串是一个字符一个字符进行赋值的,大概率是字符数组,然后一个字符一个字符填充
-
传递给子例程(函数)
0x00401089
的参数是什么?接下来的程序流程依次调用了
WSAStartup
和WSASocketA
函数,然后就来到这个函数了,参数是两个字符串,一个是main函数开头定义的:1qaz2wsx3edc
,另一个是乱码:这应该是个解码函数,执行完这个函数之后,解码结果就出来了:
-
恶意代码使用的域名是什么?
域名是:
www.practicalmalwareanalysis.com
-
恶意代码使用什么编码函数来混淆域名?
通过异或编码来混淆域名的,解码也是通过异或进行:
-
恶意代码在
0x0040106E
处调用CreateProcessA
函数的意义是什么?解码出域名后,通过
gethostbyname
函数进行DNS查询,目的应该是获取IP信息,然后进行远程连接,端口是9999(270F):连接成功后(通过nc和apateDNS和INETSIM建立连接),最后程序结束前调用了函数:sub_401000:
这里填充了StartupInfo结构体后,这里吧hStdInput和Output都传入了a5:
a5是这个连接的套接字,StartupInfo把标准输入输出都绑定成套接字,就会把输入输出都发出去,调用了CreateProcessA函数,动态看一下参数是啥:
看看我们监听的端口:
得到了反弹shell,emmm,又是个后门
Lab 9-3:
-
Lab09-03.exe导入了哪些DLL?
动态导入了DLL2.dll、User32.dll,静态导入了Kernel32.dll、NETAPI32.dll、DLL1.dll、DLL2.dll:
-
三个DLL要求的基地址是多少?
三个DLL要求的基地址都是
10000000
-
当使用OD调试exe的时候,为三个DLL分配的基地址是多少?
-
当exe调用dll1中的导入函数时,这个导入函数做了什么?
导入函数只有一个DLL1Print:这个全局变量在Dllmain中获取了进程id,这里是打印字符串+PID
-
当exe调用WriteFile时,它写入的文件名是什么?
DLL2的dllmain函数创建了一个文件:
temp.txt
:并把文件句柄保存了下来,接下来的DLL2Print打印了一下文件句柄,然后DLL2ReturnJ函数返回了文件句柄
调用WriteFile的时候文件名就是
temp.exe
,把网址写进去了 -
当exe使用NetScheduleJobAdd创建一个job时,从哪里获取第二个参数数据?
第二个参数的缓冲区在之前被DLL3的函数用过,是在那里填充的数据
进去DLL3看看,把一个固定的数据放到缓冲区里
这个数据是哪来的呢?Dllmain填充的固定值
-
当运行或调试exe时,你会看到exe打印三个神秘数据,这三个神秘数据分别是什么?
DLL1打印的是PID,DLL2打印的是文件句柄,DLL3打印的是装有字符串的地址:
DLL3的dllmain:
-
如何将dll2加载到ida中,是的它与OD使用的加载地址匹配?
ida 下选择Edit-->Segments-->Rebase Program 进行修改:
-