2020年取证能力验证如期而至,因出差在外,我只是着重看了下最后两题,分别是15题和16题。尤其是15题,涉及到了ELF的逆向,这对很多同志都是个难点。我昨晚连夜完成了任务,虽然今天很累了,但我还是于今晚抽空将过程写出来,以享同志们。下午大家答案提交了,所以晚上公布过程也不算违规了,只是一种学习过程了。
题目:15、嫌疑人使用专用程序下载远端文件,请对该程序进行分析,请列出下载程序中登录文件服务器的密码。
答:通过查看历史命令记录,发现下载程序为“PMDUMP”,恢复文件得到/var/tmp/PMDUMP。这里要用到IDA远程调试,所以将这个文件放到kali环境下。
至于怎么放,这个不讲了,应该会吧。
1、至于怎么准备IDA的远程调试工作,请参看我的以前文章:《详解对ELF64之手动脱壳的逆向分析》
https://mp.weixin.qq.com/s?__biz=MjM5NDcxMDQzNA==&mid=2247483881&idx=1&sn=fe43ba395b21b8e628191a1863228a38&chksm=a682d72491f55e3244db59439ba58a82c2d63829188868f75f86bfaf6ad773ce8d4f3f2762ae&mpshare=1&scene=1&srcid=0922SmyDaexT3zIOPrPnt7nP&sharer_sharetime=1600759326611&sharer_shareid=b1f6e5a43c641db4ff0cfaba025843dc&key=519b8bbaea533f94566716bb9d4ac0218aa3ae2b03ed8da3171e4f62cb2e4d7b8bb0c8ad337adab3aa1eefc23f2c6c412a88d887d49f49adfa605c3f7f97b1213ad9b1273b607d9759edf1a9e0f8127bb35280ece304e1ec927c32b90c24fec6fafae7d4f7153345cd8ed4ed287518fedd4d6b7ec9b4d4c6a43499cad2d27200&ascene=1&uin=MjkzNzYwMzg0MQ%3D%3D&devicetype=Windows+10+x64&version=62090529&lang=zh_CN&exportkey=AXKme2XPsMFJUVPMdWk05lo%3D&pass_ticket=gh3ChImv1QzsIlcJ7w%2BvGSikIqxjhkdwWQtL80v%2BouskWjvrkYZo%2BI8H8RAjH%2Blg&wx_header=0
2、在linux中放入linux_server64,
chmod +x linux_server64
chmod +x PMDUMP
将两个程序赋予执行权限;
3、运行 ./linux_server64
监听23946端口;
4、运行IDA,开启远程调试
5、在IDA窗口中滚动代码,在入口处停止,
往下跟踪吧,
注意这里,进入到了库文件中;库文件的尽头就是程序本体了,意味着壳要执行完了,继续执行。。。
由库文件到本体,这时壳执行完了,看到的就是程序的本来面目了,我们现在要做的就是将这本体代码Dump出来,就OK了。
6、执行一段idc脚本,让脚本来完成这项工作吧。
#include <idc.idc>
#define PT_LOAD 1
#define PT_DYNAMIC 2
static main(void)
{
auto ImageBase,StartImg,EndImg;
auto e_phoff;
auto e_phnum,p_offset;
auto i,dumpfile;
ImageBase=0x400000;
StartImg=0x400000;
EndImg=0x0;
if (Dword(ImageBase)==0x7f454c46 || Dword(ImageBase)==0x464c457f )
{
if(dumpfile=fopen("d:\tuoke.out","wb"))
{
e_phoff=ImageBase+Qword(ImageBase+0x20);
Message("e_phoff = 0x%xn", e_phoff);
e_phnum=Word(ImageBase+0x38);
Message("e_phnum = 0x%xn", e_phnum);
for(i=0;i<e_phnum;i++)
{
if (Dword(e_phoff)==PT_LOAD || Dword(e_phoff)==PT_DYNAMIC)
{
p_offset=Qword(e_phoff+0x8);
StartImg=Qword(e_phoff+0x10);
EndImg=StartImg+Qword(e_phoff+0x28);
Message("start = 0x%x, end = 0x%x, offset = 0x%xn", StartImg, EndImg, p_offset);
dump(dumpfile,StartImg,EndImg,p_offset);
Message("dump segment %d ok.n",i);
}
e_phoff=e_phoff+0x38;
}
fseek(dumpfile,0x3c,0);
fputc(0x00,dumpfile);
fputc(0x00,dumpfile);
fputc(0x00,dumpfile);
fputc(0x00,dumpfile);
fseek(dumpfile,0x28,0);
fputc(0x00,dumpfile);
fputc(0x00,dumpfile);
fputc(0x00,dumpfile);
fputc(0x00,dumpfile);
fputc(0x00,dumpfile);
fputc(0x00,dumpfile);
fputc(0x00,dumpfile);
fputc(0x00,dumpfile);
fclose(dumpfile);
}else Message("dump err.");
}
}
static dump(dumpfile,startimg,endimg,offset)
{
auto i;
auto size;
size=endimg-startimg;
fseek(dumpfile,offset,0);
for ( i=0; i < size; i=i+1 )
{
fputc(Byte(startimg+i),dumpfile);
}
}
按Alt+F7执行这段代码,成功在D:盘下生成文件tuoke.out,
7、用IDA载入tuoke.out看看脱壳后的文件,完成题干的要求,
这是程序本体的本来面目;
要找到登录用的帐号和密码,来看看这里面,
这个函数很可疑,进去看看,
发现了帐户和密码,由 createio 函数解密,再看这个函数
是个循环,有函数 getosr ,看看,
原来是个异或加解密,但不能为59或100。
至此,找到了帐号和密码,以及它们的加密方式。
8、解密
转换成PY为:decrypt = lambda a:bytes([(x-1)^0x1E if (x-1) not in [59,100] else (x-1) for x in a])
运行后得到原始密码:2020ce!@test
9、第16题,分析下载程序中登陆文件服务器的用户名的加密方式,使用该方式对字符串“k2j8u1h6”进行加密,列出的加密后字符串内容。
答:根据decrypt = lambda a:bytes([(x-1)^0x1E if (x-1) not in [59,100] else (x-1) for x in a])
反推得到解密函数为:
encrypt = lambda a:bytes([(x^0x1E)+1 if x not in [59,100] else x+1 for x in a])
运行后
print(encrypt(b"k2j8u1h6"))
输出结果为
-> "v-u'l0w)"
答案为 v-u'l0w)
OK!
感谢无糖学院导师戴华老师分享。
欢迎关注公众号MicroPest
原文始发于微信公众号(无糖反网络犯罪研究中心):2020取证能力验证中的逆向题ELF64-UPX脱壳过程
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论