-
-
[原创]看雪 2016CrackMe 攻防大赛--第20题
-
发表于: 2016-12-11 02:36 2858
-
11*11的数独。每行每列的和等于671.
用IDA打开,先看看流程。
流程:
实际执行的是: dword_1152250[8]处的函数。
上OD有反调试,不用管他,直接运行,输入注册码。
然后附加。
EIP转到do_work起始地址,反复跑了几次,发现是个11*11的数组,接着把数组dump出来,再对照代码。
1.先求第四列11个数的和
2.用这个和与每一行之和比较。。。
3.用这个和与每一列之和比较。。。
4.。。。。
明白了是数独。
表格地址:0x291fA0(代码中的nnTable)
注册码是0x290ee0(代码中的xxList)这个表中的下标,从这个表中获取到对应位的值写入nnTable中值为0的位置,如果最后构成数独就成功了。
代码:
答案:CmJF92oRcu
用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直播授课
赞赏
他的文章
赞赏
雪币:
留言: