题目

CSDN免积分下载

文件

先查壳,有壳脱壳,没壳拖入IDA
64位ELF

IDA

1626844858(1).jpg

解题

答案

nctf{o0oo00O000oooo..OO}

查看Writeup

题目描述

菜鸡想要走出菜狗设计的迷宫

运行

  1. ┌──(root🐷kali)-[/home/CTF]
  2. └─# ./CTF
  3. Input flag:
  4. JianOuZuiHuai
  5. Wrong flag!

IDA阅读

由于本程序的代码比较多,IDA阅读性比较差,可以先把IDA的一些字段和数据进行重命名。

循环语句跳转

IDA显示多个跳转“goto LABEL数字”,可以将“LABEL数字”重命名为具体的逻辑:
image.png

数据

该if判断,结合上下文代码,明显可知是对字符串的对比,此处的125应为char类型的数据:
image.png
按R键,将其转为Char类型,为闭花括号:
image.png
除了上下文外,熟悉可见字符串的各种数据(可以理解为ASCII码表)也可以很快知道这应该是一个char:image.png
同理,该程序中还有多个相似的代码部分。当出现“==”或“!=”,且等号右侧的值在ASCII码区间内:
image.png
按R键,将其转为Char类型:
image.png
image.png

代码逻辑

在数据转换时,发现一处代码较为可疑:
image.png
查看该函数传入的参数1较为奇特:
image.png
在Hex窗口显示如下:
image.png
选中该地址,发现数据大小为64(65-1,最后一个是1个结束符“00”),64是一个比较特殊的数字,推测是8*8,将行尺寸设置为8:
image.png
image.png
数据为:

  1. ******
  2. * * *
  3. *** * **
  4. ** * **
  5. * *# *
  6. ** *** *
  7. ** *
  8. ********

字符串对比

已知字符串对比有两个部分
第一部分是对比输入的字符串,是否有:“O”,“o”,“.”和“o”:
image.png
第二部分是对比是否有“ ”(空格)和“#”:

image.png

结合代码,当输入的字符串(需为“O”、“o”、“.”或“o”)满足条件时,对应到64字节的数组中
对应数组的数据为“ ”或“#”——💥

😐动了!什么动了?在15PB写坦克大战的记忆动了😐

image.png

  1. ●█〓██▄▄▄▄▄▄ ●●●●●●
  2. ▄▅██████▅▄▃▂
  3. ██████████████
  4. ◥⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲◤

结合题目提示的迷宫,和特殊的字符“*”,以及判断的代码(多个“if”+“==”),这不就是类似坦克大战的代码吗。

输入字符串 - 上下左右

输入数据正好是4个,对应上下左右。查看字符串判断符合条件的函数,刚好也出现了8(上面64字节的数组=8*8)这个数字:
image.png

🗺64字节数组 - 二维数组地图🗺

所以先前的数组就是88的64字节二维数组——也就是88字符大小的地图🗺
当输入一个值后,会对该值计算后进行判断,是否在地图(二维数组)的范围内,也就是这个操作是否合理:
image.png

迷宫路线和操作

初始的字符串长度判断为24,去掉头部的“nctf{”和末尾的“}”,操作应为24-5-1=18。要在18步内走“ ”(空格)和“#”。

路线

推测正解的迷宫走法为:
image.png

操作

➡⬇➡➡⬇⬇⬅⬇⬇⬇➡➡➡➡⬆⬆⬅⬅

操作对应的按键

+运算对应向下和向右,-运算对应向上和向左。根据二维数组的取值方式和传入的值,可推:

符号 传入值 对应操作
o 行地址
0 列地址
O 行地址
. 列地址

➡⬇➡➡⬇⬇⬅⬇⬇⬇➡➡➡➡⬆⬆⬅⬅替换为o0oo00O000oooo..OO,再填入“nctf{”和“}”中:
image.png

🥳Congratulations🥳

  1. ┌──(root🐷kali)-[/home/CTF]
  2. └─# ./CTF
  3. Input flag:
  4. nctf{o0oo00O000oooo..OO}
  5. Congratulations!