judge这个函数无法被反编译,因为可以看到程序运行后动态修改了这个函数,可以使用python脚本模拟执行后的代码,然后再反编译
import sys from idautils import * from idc import * import idaapi if __name__ =="__main__": start_addr=0x600B00 for i in range(182): PatchByte(start_addr+i,Byte(start_addr+i)^0xC)
执行之后,删除原函数
重新在main里双击进入这个函数,修改一下sp,即可反编译成功
最终代码很简单,就是每个字符循环异或i,其实这题主要是考察动态查看汇编代码的能力,但是能反编译回来当然更好
arr = [0x66, 0x6D, 0x63, 0x64, 0x7F, 0x6B, 0x37, 0x64, 0x3B, 0x56, 0x60, 0x3B, 0x6E, 0x70] flag = '' for i in range(len(arr)): flag += chr(arr[i] ^ i) print flag flag{n1c3_j0b}