运行分析
PE分析
- 32位,未知程序和壳
- 点击Scan/t按钮外部扫描,发现是C++程序
静态分析&动态调试
- 选中该函数(地址:401048 - 401172)
- Edit -> Functions -> Delete function
- 然后再选中该函数,按P键创建函数
- 按F5,反编译成功
- 分析主函数,注释如上图,还需要知道sub_401173、sub_40119B和sub_40120C函数功能
- 分析sub_401173,发现其作用是初始化变量dword_401AF0
- 动调sub_40119B函数,发现函数作用是根据Name决定0xCC和0xDD位置和个数
- 看一下结果,结合题目为snake,猜测为16*16的贪吃蛇地图
- 动调sub_40120C函数,其作用是模拟贪吃蛇的轨迹,具体如下:
- 1、贪吃蛇初始长度为1,蛇头位置为0x99
- 2、提取Serial每一位进行&3计算,得到结果转化为蛇头上下左右行为
0 -> 16 -> ↑
1 -> -16 -> ↓
2 -> -1 -> ←
3 -> 1 -> → - 3、每吃到一个0xCC,蛇身+1,蛇头不能撞到蛇身,必须吃完0xCC,最后再吃0xDD,即可弹窗成功
算法分析
from ctypes import *def sub_40119B(): global dword_401B00global dword_401700v2 = c_uint8(0)for i in Name:v2.value = (v2.value + ord(i)) & 0xffn = 0v5 = c_uint8(0)for i in range(len(Name)):v5.value = (v2.value ^ ord(Name[i]))v2.value -= v5.valuedword_401B00[v5.value] |= 0xCCi = c_uint8(0)i.value = v5.value ^ v2.valuewhile 1:v5.value = v5.value - i.valueif (dword_401B00[v5.value] != 0xCC):breaki.value = i.value - 1dword_401B00[v5.value] = 0xDDv5.value = i.valuewhile ( dword_401B00[v5.value] == 0xCC or dword_401B00[v5.value] == 0xDD):v5.value = v5.value - 1dword_401B00[v5.value] = 0x99dword_401700 = v5.valuedef sub_40120C():global mapsglobal Serialfor i in range(0,16):maps.append(dword_401B00[16*i:16*(i+1)])addr_CC = []for y in range(0,16):for x in range(0,16):if maps[y][x] == 0xCC:addr_CC.append([x,y])addr_DD = []for x in range(0,16):for y in range(0,16):if maps[y][x] == 0xDD:addr_DD.append([x,y])addr_99 = []for x in range(0,16):for y in range(0,16):if maps[y][x] == 0x99:addr_99.append([x,y])for i in range(len(addr_CC)-1,-1,-1):y = addr_99[0][1] - addr_CC[i][1]x = addr_99[0][0] - addr_CC[i][0]if y >= 0 :Serial += '1' * yelse:Serial += '0' * (-y)if x >= 0:Serial += '2' * xelse:Serial += '3' * (-x)addr_99[0] = addr_CC[i]y = addr_99[0][1] - addr_DD[i][1]x = addr_99[0][0] - addr_DD[i][0]if y >= 0 :Serial += '1' * yelse:Serial += '0' * (-y)if x >= 0:Serial += '2' * xelse:Serial += '3' * (-x)if __name__ == '__main__':Name = 'c' Serial = ''dword_401B00 = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00]maps = []sub_40119B()sub_40120C()print(Name + '的Serial为:\n' + Serial)
- 因为未限制Name个数,所以假设Name长度为1,这样比较简单
- 验证成功