网鼎2020朱雀组-Reverse-tree详解

admin 2020年5月18日06:50:10评论9 views字数 2937阅读9分47秒阅读模式

网鼎2020朱雀组-Reverse-tree详解

逆向驿站

  • 网络安全咨询

  • 日常生活中的网络安全案例解析

  • 逆向反汇编学习资料

  • 渗透测试学习资料

  • 实战病毒分析、软件逆向研究

  • 相关基本功知识速查工具

  • 区块链相关基础知识

网鼎2020朱雀组-Reverse-tree详解

网盘链接

https://pan.baidu.com/s/1YZqr9kFVu2R6R4rbgpepjQ 

提取码: q8tc

如果失效,获取最新链接,请公众号内回复:网盘


前言

朱雀组共两道reverse,难度稍大的一道是考二叉树的,当场为了快手画二叉树,发现字都快不会写了,最后补上读取应用内存的二叉树解密序列对应C代码

准备

【环境和工具】

  • win7/xp/2003虚拟机环境
  • olldbg
  • IDA

 

图文分析

IDA静态看下程序逻辑

  • 逻辑比较简单
  • 两个函数

网鼎2020朱雀组-Reverse-tree详解

网鼎2020朱雀组-Reverse-tree详解

网鼎2020朱雀组-Reverse-tree详解

OD中看二叉树结构数据

  • 可以看到第一个函数结束后会给第二个函数传入一个【0x406040】地址中的数值,即0x406530,这其实就是二叉树的root结点地址

网鼎2020朱雀组-Reverse-tree详解

  • 跟入0x406530看二叉数结构,结合汇编代码,左叉为结点地址+0xc(红色)
  • 右叉为地址+0x10(黄色)
  • 跟入左叉或右叉是下一个结点或者叶子
  • 依次类推
  • 如果是结点,结点地址数值为0
  • 如果是叶子,则是具体的a-z对应的ascii码

结点

网鼎2020朱雀组-Reverse-tree详解

叶子

网鼎2020朱雀组-Reverse-tree详解

程序整个验证逻辑分析

根据上面,我们对程序的整个验证逻辑进行下分析

  • 第一个函数验证flag格式和长度和字符范围(0-9,a-f)
  • 并吧每位flag分别对应4位二进制序列,例如0对应0000,1对应0001,f对应1111
  • 然后把root地址0x406530和生成的二进制序列传入第二个函数
  • 第二个函数根据传入的二进制序列在root这个树上进行二叉树解密
  • 例如序列010,二叉树查找顺序则为左→右→左,查找结果为字母j
  • 最后把所有的二进制序列查找完毕后生成的字符串和字符串

    zvzjyvosgnzkbjjjypjbjdvmsjjyvsjx作比较

  • 那么可见核心的问题就是要把程序中的树给从内存中dump下来
  • 当时由于求快,所以就想到了最原始的方法,内存跟踪手画二叉树

做题求快手画丑树

左叉

网鼎2020朱雀组-Reverse-tree详解

右叉

网鼎2020朱雀组-Reverse-tree详解

事后补上,内存遍历读取二叉树解密的源码

  • 更科学的方法肯定不是手画,因为容易画错,错一点也许全盘皆输
  • 画的太丑
  • 还是规规矩矩写个C代码
*//*****************************************//*葫芦娃版读应用内存数据遍历二叉树*//*爬出内存中所有明文字母对应的遍历路径*//******************************************/char sVale[128]={0};//全局记录节点遍历情况字符串0左1右//内存读取函数int GetValue(HANDLE hPID,int address){  DWORD dwRead = 0;  int v = NULL;  ::ReadProcessMemory(hPID,(LPCVOID)address,&v,4,&dwRead);  return v;}//归递遍历函数void FindNext(HANDLE hPID,int root){    if (GetValue(hPID,root)>0)  {    char s[2]={GetValue(hPID,root),0};    printf("%s:%sn",s,sVale);      }   else  {    int nlen = strlen(sVale);    sVale[nlen] ='0' ;//左0    FindNext(hPID,GetValue(hPID,root+0xc));//遍历左侧    sVale[nlen] ='1' ;//右1    FindNext(hPID,GetValue(hPID,root+0x10));//遍历右侧  }  //清掉本层归递记录结果  int nslen = strlen(sVale);  for (int i=nslen-1;i<128;i++)  {    sVale[i] = 0;  }
}
int main(){  DWORD dwPID = 0;  //根据窗口标题找到窗口句柄  HWND hCrackme013 = ::FindWindow(NULL,"C:\Users\Administrator\Desktop\wd\tree.exe");  //根据窗口句柄得到进程pid  ::GetWindowThreadProcessId(hCrackme013,&dwPID);  //根据pid以最高权限打开进程并返回进程句柄  HANDLE hPID = ::OpenProcess(PROCESS_ALL_ACCESS,false,dwPID);  FindNext(hPID,0x406530);  return 0 ;}

运行结果

网鼎2020朱雀组-Reverse-tree详解

有了这个解密结果那么就可以用直接写python脚本解密flag了,如下

d= {"b":"00010","d":"0111010","g":"0010","j":"010","k":"01111","m":"111011","n":"1011","o":"11100","p":"01101","s":"100","v":"1111","x":"011100","y":"0000","z":"1010"}str1 = "zvzjyvosgnzkbjjjypjbjdvmsjjyvsjx"out =""for s in str1:    s=d
展开收缩
out=out+sprint(out) d2={"0000":"0","0001":"1","0010":"2","0011":"3","0100":"4","0101":"5","0110":"6","0111":"7","1000":"8","1001":"9","1010":"a","1011":"b","1100":"c","1101":"d","1110":"e","1111":"f"} flag="" for i in range(0,len(out)): if i%4==0: tmp = out[i]+out[i+1]+out[i+2]+out[i+3] flag = flag + d2[tmp]print(flag)

运行得到flag,记得按照格式排一下

flag{afa41fc8-574f-1248-1a84-9d7f7120f89c}

网鼎2020朱雀组-Reverse-tree详解

 

 

去网盘中下载,试试吧

最后,喜欢这里的请推荐给你身边的朋友吧渗透测试、逆向破解、病毒分析、信息安全

网鼎2020朱雀组-Reverse-tree详解

网盘链接


https://pan.baidu.com/s/1YZqr9kFVu2R6R4rbgpepjQ 

提取码: q8tc

如果失效,获取最新链接,请公众号内回复:网盘

相关文章

● 网鼎杯2020-青龙组-reverse-signal

● CrackMe-14精解

● CrackMe-13精解-外挂方式写注册机

● CrackMe-12精解-独家全破

● CrackMe-11精解

● CrackMe-8.9.10精解-VB反汇编特点汇总

● CrackMe-007精解

● CrackMe-006精解

● CrackMe-005精解(下)

● CrackMe-005精解(上)

● CrackMe-004精解

● CrackMe-003精解

● CrackMe-002精解

● CrackMe-001精解

网鼎2020朱雀组-Reverse-tree详解End网鼎2020朱雀组-Reverse-tree详解


本公众号关注网络安全最新咨讯

逆向反汇编、病毒分析教学等

常按二维码关注

网鼎2020朱雀组-Reverse-tree详解

 

 

 

原文始发于微信公众号(逆向驿站):网鼎2020朱雀组-Reverse-tree详解

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

发表评论

匿名网友 填写信息