题目
文件
下载的文件直接后缀名就是.exe
先查壳,有壳脱壳,没壳拖入IDA
IDA
答案
查看Writeup
解题
运行
代码逻辑
上图很明显有三大块逻辑:字符串提醒,数据输入和处理,数据判断。
运行后提示的输出“please input your serial:”,从这里可以判断“sub_40134B”是一个打印字符串的函数——其实不是很重要😅
但是打印的“success!”很重要,所以:
- 查看如何能打印“success!”
- 成立条件是要进行两个字符串的对比(strcmp),需要对比结果是0,即两个字符串要相同
- 一个字符串已知,是“437261636b4d654a757374466f7246756e”
另一个字符串是转为十六进制(%x)的,原长度不超过17字节的字符串(%s)
解题逻辑
经验法
一看到“437261636b4d654a757374466f7246756e”这数据,很明显是英文字母对应的十六进制。
e是十六进制的数
- 整个字符串都在英文字母ASCII码的十六进制范围(0x41-0x5A ∩ 0x61-0x7A)
大胆推测考察十六进制转ASCII码,可以使用现成工具,或者有很多在线的转码网站。
- 使用CyberChef的Hex转码“From Hex”
- 输入需要转换的数据“437261636B4D654A757374466F7246756E”
- 得flag&input=NDM3MjYxNjM2QjRENjU0QTc1NzM3NDQ2NkY3MjQ2NzU2RQ)“CrackMeJustForFun”:
逻辑逆向法
把“437261636b4d654a757374466f7246756e”还原为17字节长度的字符,简单的说就是%x→%s。
Python
切片,转码:
strOrigin = "437261636B4D654A757374466F7246756E"
flag = ""
while(strOrigin[:2]):
#1.对字符串进行切片,取两个字符
strSlice = strOrigin[:2]
#2.把取值从原字符串中去掉
strOrigin = strOrigin[2:]
#3.将取值从十六进制转为chr类型(ASCII码),即%x→%s
flag += chr(int(strSlice,16))
print (flag)