题目
文件
IDA
解题
答案
查看Writeup
题目描述
运行
┌──(root🐷kali)-[/home/CTF]
└─# ./CTF
Input flag:
JianOuZuiHuai
Wrong flag!
IDA阅读
由于本程序的代码比较多,IDA阅读性比较差,可以先把IDA的一些字段和数据进行重命名。
循环语句跳转
IDA显示多个跳转“goto LABEL数字”,可以将“LABEL数字”重命名为具体的逻辑:
数据
该if判断,结合上下文代码,明显可知是对字符串的对比,此处的125应为char类型的数据:
按R键,将其转为Char类型,为闭花括号:
除了上下文外,熟悉可见字符串的各种数据(可以理解为ASCII码表)也可以很快知道这应该是一个char:
同理,该程序中还有多个相似的代码部分。当出现“==”或“!=”,且等号右侧的值在ASCII码区间内:
按R键,将其转为Char类型:
代码逻辑
在数据转换时,发现一处代码较为可疑:
查看该函数传入的参数1较为奇特:
在Hex窗口显示如下:
选中该地址,发现数据大小为64(65-1,最后一个是1个结束符“00”),64是一个比较特殊的数字,推测是8*8,将行尺寸设置为8:
数据为:
******
* * *
*** * **
** * **
* *# *
** *** *
** *
********
字符串对比
已知字符串对比有两个部分
第一部分是对比输入的字符串,是否有:“O”,“o”,“.”和“o”:
第二部分是对比是否有“ ”(空格)和“#”:
结合代码,当输入的字符串(需为“O”、“o”、“.”或“o”)满足条件时,对应到64字节的数组中
对应数组的数据为“ ”或“#”——💥
😐动了!什么动了?在15PB写坦克大战的记忆动了😐
●█〓██▄▄▄▄▄▄ ●●●●●●
▄▅██████▅▄▃▂
██████████████
◥⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲◤
结合题目提示的迷宫,和特殊的字符“*”,以及判断的代码(多个“if”+“==”),这不就是类似坦克大战的代码吗。
输入字符串 - 上下左右
输入数据正好是4个,对应上下左右。查看字符串判断符合条件的函数,刚好也出现了8(上面64字节的数组=8*8)这个数字:
🗺64字节数组 - 二维数组地图🗺
所以先前的数组就是88的64字节二维数组——也就是88字符大小的地图🗺
当输入一个值后,会对该值计算后进行判断,是否在地图(二维数组)的范围内,也就是这个操作是否合理:
迷宫路线和操作
初始的字符串长度判断为24,去掉头部的“nctf{”和末尾的“}”,操作应为24-5-1=18。要在18步内走“ ”(空格)和“#”。
路线
操作
操作对应的按键
+运算对应向下和向右,-运算对应向上和向左。根据二维数组的取值方式和传入的值,可推:
符号 | 传入值 | 对应操作 |
---|---|---|
o | 行地址 | ➡ |
0 | 列地址 | ⬇ |
O | 行地址 | ⬅ |
. | 列地址 | ⬆ |
➡⬇➡➡⬇⬇⬅⬇⬇⬇➡➡➡➡⬆⬆⬅⬅替换为o0oo00O000oooo..OO,再填入“nctf{”和“}”中:
🥳Congratulations🥳
┌──(root🐷kali)-[/home/CTF]
└─# ./CTF
Input flag:
nctf{o0oo00O000oooo..OO}
Congratulations!