2019北邮网安杯官方解题报告——Re2


Re2

监控了两个地址处的错误,一个是在0x401166处的除零错误,当遇到该错误时将Eip+2跳过该指令。

除零错误


第二处是在0x401007处的错误。

代码异常


父进程检测到异常在0x401007后,通过ReadProcessMemory读取0x401000处的代码,长度为327。将读取到的数据异或0x55后再通过WriteProcessMemory写入到子进程中,调整其Eip0x401000处,重新执行该函数。

修复错误代码

编写脚本,此处使用IDC,希望使用IDAPython的同学也可以使用,将0x4010000x401147处的数据异或0x55

修改数据

  #include <idcc.idc>
static main(){
auto a = 0x401000;
   auto i;
   for(i=a; i<0x00401147;i++){
       PatchByte(i,Byte(i)^0x55);
  }
}

loc_401000CreateFunction得到如下函数

正确代码

其中红框所示部分为使用汇编所编写的IsDebuggerPresent,由下面的语句可知,当其未检测到调试器时程序将会直接退出,使用OD调试时需要注意。

向下继续查看代码为校验逻辑。通过分析可知其为ROT13算法。将v5处字符串整理出来,进行逆运算即可。

校验逻辑

 解密脚本:

  flag = 'OHCG{Jbj_4gf_eBg_y6_rapelcg}'
ans = ''

for i in flag:
if ord(i) in range(ord('A'),ord('Z')+1):
ans += chr((ord(i)-ord('A')-13)%26+ord('A'))
elif ord(i) in range(ord('a'),ord('z')+1):
ans += chr((ord(i)-ord('a')-13)%26+ord('a'))
elif ord(i) in range(ord('0'),ord('9')+1):
ans += chr((ord(i)-ord('0')-13)%10+ord('0'))
else:
ans += i
print(ans)


得到flagBUPT{Wow_1ts_rOt_l3_encrypt}

最新回复 (1)
  • 小白 qscrgn 3月前
    0 2
    可以解释下第一步是怎么来的吗。。。刚学ctf
返回
发新帖