题目

CSDN免积分下载

文件

先查壳,有壳脱壳,没壳拖入IDA
32位EXE

IDA

image.png

解题

答案

flag{reversing_is_not_that_hard!}

查看Writeup

题目描述

听说运行就能拿到Flag,不过菜鸡运行的结果不知道为什么是乱码

运行

image.png

代码逻辑

  1. 复制409B10中的数据到申请的堆空间中
  2. 检测是否反调试
  3. 没有则将堆空间的数据作为MessageBoxA的第二个参数(显示的内容,即上图的中文乱码部分)弹框:

image.png
此时传入MessageBoxA的参数2数据是乱码:
image.png
通过交叉引用可以看到,该堆空间还有在函数401000中进行异或解密处理:
image.png
异或处理的数据为409B10和409B38:
image.png
分别为密文和密钥,数据为:

  1. listPass = [ 0xBB, 0xCC, 0xA0, 0xBC, 0xDC, 0xD1, 0xBE, 0xB8, 0xCD, 0xCF, 0xBE, 0xAE, 0xD2, 0xC4, 0xAB, 0x82, 0xD2, 0xD9, 0x93, 0xB3, 0xD4, 0xDE, 0x93, 0xA9, 0xD3, 0xCB, 0xB8, 0x82, 0xD3, 0xCB, 0xBE, 0xB9, 0x9A, 0xD7, 0xCC, 0xDD ]
  2. listKey = [ 0xBB, 0xAA, 0xCC, 0xDD ]

解题方式

1️⃣动态运行 - 反反调试

同上面的代码逻辑部分已经推理出了,在运行到反调试检测时,要修改跳转去执行401000。此处的跳转指令是JE,对应ZF标志位:
image.png
执行到401000时可以看到,传入的寄存器为EDX,此处地址对应数据是乱码:
image.png
运行过401000后,该地址的数据已解密:
image.png
还可以通过修改/跳过JMP或修改EIP, 运行到弹框代码将Flag弹出,不过不是很有必要:
image.png

2️⃣Python脚本 - 异或解密

由于解密代码比较简单,就是异或,数据也比较容易获取。在比较难调的情况,可以通过Python等代码解密:
image.png

  1. listPass = [ 0xBB, 0xCC, 0xA0, 0xBC, 0xDC, 0xD1, 0xBE, 0xB8, 0xCD, 0xCF, 0xBE, 0xAE, 0xD2, 0xC4, 0xAB, 0x82, 0xD2, 0xD9, 0x93, 0xB3, 0xD4, 0xDE, 0x93, 0xA9, 0xD3, 0xCB, 0xB8, 0x82, 0xD3, 0xCB, 0xBE, 0xB9, 0x9A, 0xD7, 0xCC, 0xDD ]
  2. listKey = [ 0xBB, 0xAA, 0xCC, 0xDD ]
  3. def Xor(strPass, key):
  4. strXOR = ""
  5. for i in range(len(strPass)):
  6. strXOR += (chr(strPass[i] ^ key[i % len(key)]))
  7. return strXOR
  8. print("Flag是:", Xor(listPass,listKey))

image.png

CTF汇总

2021.05.25 XCTF入门RE _ CTF - RE