首页
社区
课程
招聘
[原创]看雪 2016CrackMe 攻防大赛--第20题
发表于: 2016-12-11 02:36 2858

[原创]看雪 2016CrackMe 攻防大赛--第20题

2016-12-11 02:36
2858
11*11的数独。每行每列的和等于671.

用IDA打开,先看看流程。
流程:
.text:01141F4A                 call    dword_1152250+20h
.text:01141F50                 retn


  dword_1152250[0] = (int)func_hehe_sub_20_1141150;
  dword_1152250[1] = (int)func_hehe_equ_0_1141180;
  dword_1152250[2] = (int)func_hehe_equ_fu3_11411B0;
  dword_1152250[3] = (int)func_hehe_sub_2_1141090;
  dword_1152250[4] = (int)func_print_success;
  dword_1152250[5] = (int)func_hehe_sub_3_11410f0;
  dword_1152250[6] = (int)func_hehe_equ_fu3_11411B0;
  dword_1152250[7] = (int)func_hehe_equ_fu1_1141120;
  dword_1152250[8] = (int)do_work;
  dword_1152250[9] = (int)do_work_1;
  dword_1152250[10] = (int)do_work_2;
  dword_1152250[11] = (int)do_work_4;


实际执行的是: dword_1152250[8]处的函数。
上OD有反调试,不用管他,直接运行,输入注册码。
然后附加。
EIP转到do_work起始地址,反复跑了几次,发现是个11*11的数组,接着把数组dump出来,再对照代码。
1.先求第四列11个数的和
2.用这个和与每一行之和比较。。。
3.用这个和与每一列之和比较。。。
4.。。。。

明白了是数独。

表格地址:0x291fA0(代码中的nnTable)
注册码是0x290ee0(代码中的xxList)这个表中的下标,从这个表中获取到对应位的值写入nnTable中值为0的位置,如果最后构成数独就成功了。

代码:

# -*- coding: cp936 -*-

#输入的注册码为下标 在这里边取值,填入nnTable中值为0的地方,如果形成11*11的数独就成功了
xxList=[0x3A,    0x5D,    0x49,    0x5F,    
	0x78,    0x51,    0x0F,    0x55,    
	0x5E,    0x12,    0x15,    0x26,    
	0x58,    0x47,    0x69,    0x6D,    
	0x3F,    0x5C,    0x56,    0x3D,    
	0x29,    0x04,    0x77,    0x4F,    
	0x52,    0x6E,    0x2C,    0x1B,    
	0x44,    0x1C,    0x14,    0x4C,    
	0x46,    0x03,    0x3B,    0x25,    
	0x38,    0x06,    0x7B,    0x7E,    
	0x0C,    0x24,    0x4E,    0x3C,    
	0x1E,    0x13,    0x1D,    0x53,    
	0x40,    0x57,    0x54,    0x6A,    
	0x5B,    0x31,    0x66,    0x27,    
	0x74,    0x32,    0x2A,    0x5A,    
	0x60,    0x0A,    0x02,    0x3E,    
	0x34,    0x08,    0x6F,    0x23,    
	0x7F,    0x30,    0x10,    0x07,    
	0x64,    0x17,    0x67,    0x05,    
	0x48,    0x62,    0x7A,    0x73,    
	0x01,    0x71,    0x1F,    0x37,    
	0x18,    0x70,    0x4B,    0x7C,    
	0x2E,    0x79,    0x2D,    0x33,    
	0x20,    0x28,    0x2B,    0x43,    
	0x22,    0x72,    0x36,    0x41,    
	0x11,    0x42,    0x6B,    0x61,    
	0x59,    0x19,    0x2F,    0x39,    
	0x68,    0x45,    0x0B,    0x76,    
	0x1A,    0x21,    0x7D,    0x80,    
	0x4D,    0x63,    0x50,    0x16,    
	0x65,    0x35,    0x6C,    0x4A,    
	0x0E,    0x75,    0x09,    0x0D,    
	0x02,    0x03,    0x04,    0x05,    
	0x06,    0x07,    0x08,    0x09,    
	0x0A,    0x0B,    0x0C,    0x0D,    
	0x0E,    0x0F,    0x10,    0x11,    
	0x12,    0x13,    0x14,    0x15,    
	0x16,    0x17,    0x18,    0x19,    
	0x1A,    0x1B,    0x1C,    0x1D,    
	0x1E,    0x1F,    0x20,    0x21,    
	0x22,    0x23,    0x24,    0x25,    
	0x26,    0x27,    0x28,    0x29,    
	0x2A,    0x2B,    0x2C,    0x2D,    
	0x2E,    0x2F,    0x30,    0x31,    
	0x32,    0x33,    0x34,    0x35,    
	0x36,    0x37,    0x38,    0x39,    
	0x3A,    0x3B,    0x3C,    0x3D,    
	0x3E,    0x3F,    0x40,    0x41,    
	0x42,    0x43,    0x44,    0x45,    
	0x46,    0x47,    0x48,    0x49,    
	0x4A,    0x4B,    0x4C,    0x4D,    
	0x4E,    0x4F,    0x50,    0x51,    
	0x52,    0x53,    0x54,    0x55,    
	0x56,    0x57,    0x58,    0x59,    
	0x5A,    0x5B,    0x5C,    0x5D,    
	0x5E,    0x5F,    0x60,    0x61,    
	0x62,    0x63,    0x64,    0x65,    
	0x66,    0x67,    0x68,    0x69,    
	0x6A,    0x6B,    0x6C,    0x6D,    
	0x6E,    0x6F,    0x70,    0x71,    
	0x72,    0x73,    0x74,    0x75,    
	0x76,    0x77,    0x78,    0x79,    
	0x7A,    0x7B,    0x7C,    0x7D,    
	0x7E,    0x7F,    0x80,    0x81]


def findChar(nValue):
    for i,x in enumerate(xxList):
        if nValue==x:
            return(i,chr(i))
    return (0,"")

nnTable=[0x0,    0x2D,    0x42,    0x4C,    0x56,    0x60,    0x6A,    0x74,    0x05,    0x0F,    0x19,
        0x3B,    0x0,     0x4F,    0x59,    0x6E,    0x78,    0x09,    0x13,    0x1D,    0x27,    0x31,    
        0x53,    0x5D,    00,      0x71,    0x02,    0x0C,    0x21,    0x2B,    0x35,    0x3F,    0x49,
        0x6B,    0x75,    0x06,    00,      0x1A,    0x24,    0x2E,    0x38,    0x4D,    0x57,    0x61,    
	0x0A,    0x14,    0x1E,    0x28,    0,       0x3C,    0x46,    0x50,    0x5A,    0x64,    0x79,
        0x17,    0x2C,    0x36,    0x40,    0x4A,    0,       0x5E,    0x68,    0x72,    0x03,    0x0D,
        0x2F,    0x39,    0x43,    0x58,    0x62,    0x6C,    0,       0x07,    0x11,    0x1B,    0x25,
        0x47,    0x51,    0x5B,    0x65,    0x6F,    0x0B,    0x15,    0,       0x29,    0x33,    0x3D,    
	0x5F,    0x69,    0x73,    0x04,    0x0E,    0x18,    0x22,    0x37,    0,       0x4B,    0x55,    
        0x77,    0x08,    0x12,    0x1C,    0x26,    0x30,    0x3A,    0x44,    0x4E,    0,       0x6D,    
        0x16,    0x20,    0x2A,    0x34,    0x3E,    0x48,    0x52,    0x5C,    0x66,    0x70,    0x01]

tempList=[]
for i in range(0,11):
    nSum=0
    for j in xrange(0,11):
        nSum=nSum+nnTable[i*11+j]    
    #print "%d,%02x"%(nSum,671-nSum)
    tempList.append(671-nSum)

strKey=""
for x in tempList:
    n,s=findChar(x)
    #print "%02x %s"%(n,s)
    strKey+=s
print strKey


答案:CmJF92oRcu

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回