首页
社区
课程
招聘
[原创]
2018-6-19 00:02 2373

[原创]

2018-6-19 00:02
2373

找到main函数,动态调试发现先初始化两个字符串

然后对输入进行检查,输入的长度必须为22,输入必须为0-9,a-z,A-Z。
可逆向出关键的数据结构如下
struct Str{
char s[32];
int length;
};
struct node{
struct Str data ;
struct node *child[32];
int node_length; //孩子指针个数
int flag; //标识节点node个数
}
输入被按顺序分为了如下几组:
{13,14,15} ,{0,1},{9,10,11,12},{4,5,6},{2,3},{7,8},{16,17,18},{19,20,21}

依次执行sub_403AB0()函数(把字符串转化为结构体Str)和sub_402B40()(把输入的字符串与根节点的子节点依次作比较,如果相等则该节点flag字段加一,如果前面字符相等,但长度大于该节点就会递归操作,如果不相等就添加为子节点),最后与dword_407E48处的结构体作比较,可动态调试出最终的结构体为如下结构:

一共8组输入,分别为kx,c7,c7Mk,c7M,c7M,ct,ctf,ct9
又因为
input[1]^input[0]=84
input[8]^input[7]=19
input[14]^input[15]=18
input[17]^input[18]=77
可推导出8组输入依次为ctf,c7,c7Mk,c7M,ct,kx,ct9,c7M
最后得到注册码为c7ctc7Mkxc7Mkctfct9c7M


[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (2)
雪    币: 3
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
Babel 2018-6-20 23:23
2
0
不错
雪    币: 196
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
getflag 2018-7-3 14:29
3
0
请问,关键数据结构是怎么逆出来的呢?
游客
登录 | 注册 方可回帖
返回