0x01 题目描述
题目比较简单,不过这种题感觉比单纯的逆向算法来有意思的多,所以记录一下~
0x02 脱壳
先拖到IDA瞅一眼,发现加壳了
用PEID查一下是什么壳,但是没有查出来。使用Strings看一下有没有什么可参考的信息,发现是UPX 3.91的壳,
但是在UPX官网上下载的脱壳工具并没有成功脱壳,那么手脱吧。
UPX的脱壳比较简单,找到pushad 和popad下断点,然后往下跟就好,找到的OEP
使用OD打开evil.exe,首先可以看到开头的一段在循环调用一个函数,函数内进行了pushad, popad操作
我们之间跳过这段循环F4跳到循环的下一条指令,然后继续跟进,发现这儿还有个pushad
之间看后面的代码,发现popad,F4到popad后继续往下跟(也可以在pushad的时候在栈上下硬件访问断点)
到这个地方已经很明显是程序的入口点了
右键使用OllyDump将程序dump出来即可,UPX加壳的程序不需要修复IAT就可以直接运行
0x03 代码分析
将脱壳后的程序拖入IDA(有些函数名有所修改)
sub_401370函数的逻辑如下,主要行为为拷贝evil.exe到%temp%下一份,在从资源中释放evil.docx文件到当前目录
创建一个进程evil.exe "evil.exe",然后打开docx
delete_exe的功能很简单,就是如果命令行参数个数为2(即之前新创建的进程),则循环删除evil.exe文件
read_shellcode_from_internet_jpg从http://www.ddctf.com/x.jpg中读取数据。x.jpg即题目中的x.jpg,自建服务器然后将x.jpg放在
服务器上,修改本地hosts将www.ddctf.com指向自建服务器即可
之后是两个解码函数,这里可以直接忽略其中的逻辑。
然后是执行shellcode的函数execute_shellcode,OD动态跟一下看执行的shellcode内容是什么
使用OD动态跟到执行shellcode的地方,发现一堆push数据的地方,这在shellcode中是一种典型的字符串存储手段,
执行完push之后,在数据窗口检查栈内存中存储的数据即可看到Key