逆向驿站
-
网络安全咨询
-
日常生活中的网络安全案例解析
-
逆向反汇编学习资料
-
渗透测试学习资料
-
实战病毒分析、软件逆向研究
-
相关基本功知识速查工具
-
区块链相关基础知识
网盘链接
https://pan.baidu.com/s/1YZqr9kFVu2R6R4rbgpepjQ
提取码: q8tc
如果失效,获取最新链接,请公众号内回复:网盘
前言
朱雀组共两道reverse,难度稍大的一道是考二叉树的,当场为了快手画二叉树,发现字都快不会写了,最后补上读取应用内存的二叉树解密序列对应C代码
准备
【环境和工具】
- win7/xp/2003虚拟机环境
- olldbg
- IDA
图文分析
IDA静态看下程序逻辑
- 逻辑比较简单
- 两个函数
OD中看二叉树结构数据
- 跟入0x406530看二叉数结构,结合汇编代码,左叉为结点地址+0xc(红色)
- 右叉为地址+0x10(黄色)
- 跟入左叉或右叉是下一个结点或者叶子
- 依次类推
- 如果是结点,结点地址数值为0
- 如果是叶子,则是具体的a-z对应的ascii码
结点
叶子
程序整个验证逻辑分析
根据上面,我们对程序的整个验证逻辑进行下分析
- 第一个函数验证flag格式和长度和字符范围(0-9,a-f)
- 并吧每位flag分别对应4位二进制序列,例如0对应0000,1对应0001,f对应1111
- 然后把root地址0x406530和生成的二进制序列传入第二个函数
- 第二个函数根据传入的二进制序列在root这个树上进行二叉树解密
- 例如序列010,二叉树查找顺序则为左→右→左,查找结果为字母j
- 最后把所有的二进制序列查找完毕后生成的字符串和字符串
zvzjyvosgnzkbjjjypjbjdvmsjjyvsjx作比较
- 那么可见核心的问题就是要把程序中的树给从内存中dump下来
- 当时由于求快,所以就想到了最原始的方法,内存跟踪手画二叉树
做题求快手画丑树
左叉
右叉
事后补上,内存遍历读取二叉树解密的源码
- 更科学的方法肯定不是手画,因为容易画错,错一点也许全盘皆输
- 画的太丑
- 还是规规矩矩写个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 ;
}
运行结果
有了这个解密结果那么就可以用直接写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+s
print(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}
去网盘中下载,试试吧
最后,喜欢这里的请推荐给你身边的朋友吧(渗透测试、逆向破解、病毒分析、信息安全等)
网盘链接
https://pan.baidu.com/s/1YZqr9kFVu2R6R4rbgpepjQ
提取码: q8tc
如果失效,获取最新链接,请公众号内回复:网盘
● CrackMe-8.9.10精解-VB反汇编特点汇总
本公众号关注网络安全最新咨讯 逆向反汇编、病毒分析教学等 常按二维码关注End
原文始发于微信公众号(逆向驿站):网鼎2020朱雀组-Reverse-tree详解
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论