首页
论坛
课程
招聘
[原创] 第二题wp
2018-6-20 10:36 1742

[原创] 第二题wp

2018-6-20 10:36
1742
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


看雪侠者千人榜,看看你上榜了吗?

最后于 2018-6-20 11:14 被瞧红尘编辑 ,原因:
收藏
点赞0
打赏
分享
最新回复 (3)
雪    币: 6854
活跃值: 活跃值 (193)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
点中你的心 活跃值 2018-6-21 09:36
2
0
感谢分享                                                 
雪    币: 259
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
我的熊猫 活跃值 2018-6-21 19:29
3
0
请教一下楼主,你用的ida是哪个版本的?文中data是自己命的名么
雪    币: 156
活跃值: 活跃值 (104)
能力值: ( LV13,RANK:345 )
在线值:
发帖
回帖
粉丝
瞧红尘 活跃值 2 2018-6-22 09:21
4
0
我的熊猫 请教一下楼主,你用的ida是哪个版本的?文中data是自己命的名么
是的,ida中可以设置结构体/类型         
      自定义结构体(shift  F1) 
游客
登录 | 注册 方可回帖
返回