ida看整体结构
401c40 函数,通过OD跟参数,发现参数为 输入字符串,成功文字,失败文字
int __cdecl funCalc_401C40(char *a1Input, int strOK, int strError)
这里输入的时候会分成8个字符串的
如: 0123456789abcdefghijkl 分成了: 01 23 456 78 9abc def ghi jkl
提示成功的字符串的路线是主线,401B80 calc2
的判断比较简单
(注:我在402B40跟踪分析了很久,里面还递归, 一直不得要领,浪费了大量时间,
最后看了几个小时小说,回来跳过了这部分分析,
经过几次对比字串,猜测结构体的结构,反过来很快能看出函数的意思 .....)
402B40 是把字串添加到结构体中//先猜出结构体再猜出本函数的意思
struct myStru //原始的结构体,只给出大小就可以了
{
int data[68];
};
看4030E0 calc1
calc1 是一个比较结构体的函数
输入的结构体,比较一个固定结构体myStru(00407E48),每次初始化后对比的都一致
od执行到calc1处,看内存地址
000778F8 20 52 07 00 "00" 00 00 00 00 00 00 00 00 00 00 00 R.............
00077908 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00077918 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00077928 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00077938 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00077948 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00077958 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00077968 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00077978 00 00 00 00 00 00 00 00 D0 76 07 00 E8 77 07 00 ........衯.鑧.
00077988 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00077998 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000779A8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000779B8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000779C8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000779D8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000779E8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000779F8 00 00 00 00 00 00 00 00 "02 00 00 00" "00 00 00 00 " ...............
//一眼看00407E48没啥可比较的东西,
这不是太简单了吗,只比较几个数值吗?
//其实这个结构体是可以展开的,因为下面有个递归呀
而且递归的子结构是和本身结构一样的,
----------------------------
//当确定结构体是这样的时候,这道题已经没有难度了
结构体::::
struct myStru
{
int data0;
char curStr[0x84];
myStru* subList[0x20];
int subCount;
int curCount;
};
struct myStruX
{
int x1;
myStru *x2;
};
结构体转换完成后IDA显示样式就如下
把00407E48结构体展开 ("kx" 0,1 表示字符串是kx,子项数为0,"kx"数目为1)
"" 2,0
"kx" 0,1
"c" 2,0
"7" 1,1
"M" 1,2
"k" 0,1
"t" 2,1
"9" 0,1
"f" 0,1
---------------------------
就是如下: (还是猜测)
字串 数目
kx 1
c7 1
c7M 2
c7Mk 1
ct9 1
ctf 1
ct 1
总数目=2+2+3*2+4+3+3+2=22 和前面输入的一样
----------------------
往里面输入看看就知道了
测试输入: kx c7 c7M ct c7Mk ctf c7M ct9 (8个字符串) 这8个是从
00407E48
中提取的
过了calc1校验(calc是比较对象集合的字符串是否一样),calc2失败,因为排列错误
int __cdecl funCalc2_401B80(char *a1, char *a2, int a3, int a4, char *strOK, char *strError)
if ( (a1[1] ^ *a1) != 0x54 c7
|| (a2kx[1] ^ *a2kx) != 0x13 kx
|| (*(char *)(a3 + 1) ^ *(char *)(a3 + 2)) != 0x12 ctf
|| (*(char *)(a4 + 2) ^ *(char *)(a4 + 1)) != 0x4D ) ct9
ok,结论就是
c7 ct c7M kx c7Mk ctf ct9 c7M
即c7ctc7Mkxc7Mkctfct9c7M
[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界
最后于 2018-6-20 11:14
被瞧红尘编辑
,原因: