这题的考点是花指令,进入了ida发现无法进行F5反汇编,左边的函数名中也没有找到main函数,这里可以通过图形视图进入
点击这个然后滑倒指令窗口双击main
即可前往main函数地址
因为一直按F5无法进行反汇编才是是进行了混淆或者存在花指令影响汇编,往下查看汇编代码寻找线索
这里发现条件跳转并且没有进行比较且跳转地方相同,可以断定为花指令一直到填充到此处异或运算不是垃圾指令
发现此处存在爆红再往下看看还有什么线索,将整个函数翻完发现存在四个这种爆红call全部进行nop到了函数尾部结束的时候对其进行P然后点击跳转即可返回函数头
到这里所有花指令已经解除,审代码逻辑后得出结果
dt = [0xd9, 0x2c, 0x27, 0xd6, 0xd8, 0x2a, 0xda, 0x2d, 0xd7, 0x2c, 0xdc, 0xe1, 0xdb, 0x2c, 0xd9, 0xdd, 0x27, 0x2d, 0x2a, 0xdc, 0xdb, 0x2c, 0xe1, 0x29, 0xda, 0xda, 0x2c, 0xda, 0x2a, 0xd9, 0x29, 0x2a]
def kaisa(xx, kk):
return [(x+kk) & 0xFF for x in xx]
def xor(xx, kk):
return [x ^ kk for x in xx]
def check(xx):
for x in xx:
if x < ord('0') or (x > ord('9') and x < ord('a')) or x > ord('f'):
return False
return True
if __name__ == '__main__':
for k1 in range(0x100):
tt = kaisa(dt, k1)
for k2 in range(0x100):
tt2 = xor(tt, k2)
if check(tt2):
print(bytes(tt2))
print(k1, k2)