2020取证能力验证中的逆向题ELF64-UPX脱壳过程

admin 2020年9月24日15:26:06评论7 views字数 3525阅读11分45秒阅读模式

 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

2020取证能力验证中的逆向题ELF64-UPX脱壳过程

监听23946端口;

4、运行IDA,开启远程调试

2020取证能力验证中的逆向题ELF64-UPX脱壳过程

5、在IDA窗口中滚动代码,在入口处停止,

2020取证能力验证中的逆向题ELF64-UPX脱壳过程

往下跟踪吧,

2020取证能力验证中的逆向题ELF64-UPX脱壳过程

2020取证能力验证中的逆向题ELF64-UPX脱壳过程

2020取证能力验证中的逆向题ELF64-UPX脱壳过程

2020取证能力验证中的逆向题ELF64-UPX脱壳过程

2020取证能力验证中的逆向题ELF64-UPX脱壳过程

注意这里,进入到了库文件中;库文件的尽头就是程序本体了,意味着壳要执行完了,继续执行。。。

2020取证能力验证中的逆向题ELF64-UPX脱壳过程

由库文件到本体,这时壳执行完了,看到的就是程序的本来面目了,我们现在要做的就是将这本体代码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,

2020取证能力验证中的逆向题ELF64-UPX脱壳过程

7、用IDA载入tuoke.out看看脱壳后的文件,完成题干的要求,

2020取证能力验证中的逆向题ELF64-UPX脱壳过程

这是程序本体的本来面目;

要找到登录用的帐号和密码,来看看这里面,

2020取证能力验证中的逆向题ELF64-UPX脱壳过程

这个函数很可疑,进去看看,

2020取证能力验证中的逆向题ELF64-UPX脱壳过程

发现了帐户和密码,由 createio 函数解密,再看这个函数

2020取证能力验证中的逆向题ELF64-UPX脱壳过程

是个循环,有函数 getosr ,看看,

2020取证能力验证中的逆向题ELF64-UPX脱壳过程

原来是个异或加解密,但不能为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])

2020取证能力验证中的逆向题ELF64-UPX脱壳过程

运行后得到原始密码: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脱壳过程

原文始发于微信公众号(无糖反网络犯罪研究中心):2020取证能力验证中的逆向题ELF64-UPX脱壳过程

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2020年9月24日15:26:06
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   2020取证能力验证中的逆向题ELF64-UPX脱壳过程https://cn-sec.com/archives/1068537.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息