题目

CSDN资源下载(免积分)

文件

下载的文件直接后缀名就是.exe
先查壳,有壳脱壳,没壳拖入IDA

IDA

image.png

答案

CrackMeJustForFun

查看Writeup

解题

运行

image.png

代码逻辑

image.png
上图很明显有三大块逻辑:字符串提醒,数据输入和处理,数据判断。
运行后提示的输出“please input your serial:”,从这里可以判断“sub_40134B”是一个打印字符串的函数——其实不是很重要😅
但是打印的“success!”很重要,所以:

  1. 查看如何能打印“success!”
  2. 成立条件是要进行两个字符串的对比(strcmp),需要对比结果是0,即两个字符串要相同
  3. 一个字符串已知,是“437261636b4d654a757374466f7246756e”
  4. 另一个字符串是转为十六进制(%x)的,原长度不超过17字节的字符串(%s)

    解题逻辑

    经验法

    一看到“437261636b4d654a757374466f7246756e”这数据,很明显是英文字母对应的十六进制。

  5. e是十六进制的数

  6. 整个字符串都在英文字母ASCII码的十六进制范围(0x41-0x5A ∩ 0x61-0x7A)

大胆推测考察十六进制转ASCII码,可以使用现成工具,或者有很多在线的转码网站。

  1. 使用CyberChef的Hex转码“From Hex”
  2. 输入需要转换的数据“437261636B4D654A757374466F7246756E”
  3. 得flag&input=NDM3MjYxNjM2QjRENjU0QTc1NzM3NDQ2NkY3MjQ2NzU2RQ)“CrackMeJustForFun”:


image.png

逻辑逆向法

把“437261636b4d654a757374466f7246756e”还原为17字节长度的字符,简单的说就是%x→%s。

Python

切片,转码:

  1. strOrigin = "437261636B4D654A757374466F7246756E"
  2. flag = ""
  3. while(strOrigin[:2]):
  4. #1.对字符串进行切片,取两个字符
  5. strSlice = strOrigin[:2]
  6. #2.把取值从原字符串中去掉
  7. strOrigin = strOrigin[2:]
  8. #3.将取值从十六进制转为chr类型(ASCII码),即%x→%s
  9. flag += chr(int(strSlice,16))
  10. print (flag)