查壳
无壳
IDA
这个一开始点开每个函数看有点唬人,但是整体看下main函数结构挺简单的……ORZ
在循环内处理v19字符串,然后和flag的每个字符串异或得到v16字符串
解题
这里踩了一个坑,v17=sub_406D90 % 22 我看出来是有22种情况,但是没把他替换掉原本循环10次的do while,而是在do while(exp中改用while表示)前做了20次循环的嵌套。想看看每一种v17的结果。
以下输出的结果全是12390,因为v19变化后再次进入while循环,v19被清零,同时v16的值也没有变化:
byte=[
0x5F, 0xF2, 0x5E, 0x8B, 0x4E, 0x0E, 0xA3, 0xAA, 0xC7, 0x93,
0x81, 0x3D, 0x5F, 0x74, 0xA3, 0x09, 0x91, 0x2B, 0x49, 0x28,
0x93, 0x67, 0x00, 0x00
]
flag=''
v20=10
for i in range(0,22):
while(v20>0):
v17=i
v19=0
v16=byte[i]
# v15=flag[i]
v14=i+1
v18=0
while(v18<v14):
v18+=1
v19=1828812941 * v19 + 12345
flag=(v16^v19)&0xff
v20-=1
print(chr(flag),end='')
生成的值重复了20次,while(v20>0)毫无作用。遂删除while循环。
回过头来看,伪代码的do while也是有问题的,只循环10次,和上文明示的flag长度22不符:
因此直接用22次for循环替代原来10次while循环。
EXP
byte=[
0x5F, 0xF2, 0x5E, 0x8B, 0x4E, 0x0E, 0xA3, 0xAA, 0xC7, 0x93,
0x81, 0x3D, 0x5F, 0x74, 0xA3, 0x09, 0x91, 0x2B, 0x49, 0x28,
0x93, 0x67, 0x00, 0x00
]
flag=''
v20=10
for i in range(0,22):
# while(v20>0):
v17=i
v19=0
v16=byte[i]
# v15=flag[i]
v14=i+1
v18=0
while(v18<v14):
v18+=1
v19=1828812941 * v19 + 12345
flag=(v16^v19)&0xff
# v20-=1
print(chr(flag),end='')
flag
flag{d826e6926098ef46}