首先用IDA64位打开文件,F5,发现神秘的judge函数。
judge函数被加密了,转到汇编,是个样子的,无法反编译。
这个时候取消judge的定义【快捷键U】,在IDA的python栏中输入代码如下。
judge=0x600B00
for i in range(182):
addr=0x600B00+i
byte=get_bytes(addr,1)
byte=ord(byte)^0xC
patch_byte(addr,byte)
然后再定义函数judge【快捷键D】,这样,函数就可以F5了,我们会得到这样的代码。
阅读函数发现,v2-v15就是flag_encode,快捷键R把数字转化字符串,再写脚本得到flag。
flag_enc="fmcd\x7fk7d;V\x60;np"
flag=""
for i in range(len(flag_enc)):
c=flag_enc[i]
flag+=chr(ord(c)^i)
print flag
flag = flag{n1c3_j0b}
首先在函数中查找窗口弹出的函数,然后查找其调用位置,不能反汇编,函数开头按P键即可f5反汇编。
发现判断长度的语句,推断sub_401630为flag。
判断语句
然后动态调试,将flag每位值v3[v5 + 96 + v4]存到寄存器里。(f9->本地调试,按绿色箭头即可开始调试)
输入33位长字符串,查看ecx寄存器的变化情况。(最后一位变动后寄存器位置会发生偏移,所以要提前做好记录)
03 evr
32位IDA打开,F5后发现main_0函数。
双击后,报错,快捷键G找到地址413238。
在汇编窗口找到。
利用快捷键alt + K 修复sp。【根据提示的value输入,如果第一处修复后还是无法反编译,那么往上尝试】
反编译成功后,找到程序入口,观察程序。
获得flag_encode。
转化为十进制:30, 21, 2, 16, 13, 2 ,72, 111, 2 ,221, 72, 100,99, 215, 46, 44, 254, 106, 109, 42, 242, 111, 154, 77,139, 75, 10, 138, 79, 69, 23, 70, 79, 20, 11
全部数都与0x76异或。
然后flag_encode分为五个部分进行不同的算法,写出脚本。
flag_enc=[30, 21, 2, 16, 13, 72, 72, 111, 221, 221, 72, 100, 99, 215, 46, 44, 254, 106, 109, 42, 242, 111, 154, 77, 139, 75, 10, 138, 79, 69, 23, 70, 79, 20, 11];
flag=""
for i in range(7):
flag+=chr(flag_enc[i]^0x76)
for i in range(7):
for c in range(0x20,0x7f):
origc=c
c=c^0x76^0xad
c=((2*c)&0xff)&0xaa|(0xff&((c&0xaa)>>1))
if c==flag_enc[7+i]:
flag+=chr(origc)
break
for i in range(7):
for c in range(0x20,0x7f):
origc=c
c=c^0x76^0xbe
c=((4*c)&0xff)&0xcc|(0xff&((c&0xcc)>>2))
if c==flag_enc[14+i]:
flag+=chr(origc)
break
for i in range(7):
for c in range(0x20,0x7f):
origc=c
c=c^0x76^0xef
c=((16*c)&0xff)&0xf0|(0xff&((c&0xf0)>>4))
if c==flag_enc[21+i]:
flag+=chr(origc)
break
for i in range(7):
flag+=chr(flag_enc[i+28]^0x76)
print flag
flag = hctf{>>D55_CH0CK3R_B0o0M!-9193a09b}