南邮攻防训练平台逆向maze

 

文件为 ELF64 可执行文件,输入正确 flag 返回判定结果的逆向题。

用 ida 打开,先看f5之后的代码,容易知道 flag 长度为24位,以 "nctf{" 为前缀:

先是一个对字符的判定过程:

可以看出是对输入的字符串进行判断,当当前字符值大于78则再次与79和111进行比较,满足条件则分别跳入 sub_400650 和 sub_400660 函数中,分别对应自增一和自减一,且范围为(0,8);else 中情况也一样,但是区别在于上者是 &v9+1 而下者是 &v9 ,接着看:

每次判断完之后都回跳至 LABEL_15 处,调用 sub_400690 函数判断,而其中的参数 asc_601060 为字符串 :“ *******   *  **** * ****  * ***  *#  *** *** ***     ********* ”,长度为64,刚好是8*8,一个方阵,而函数则是进行判定当前那位置不能为‘ * ’字符,并且最后必须跳至‘ # ’字符处,否则输出“错误”;假如换行成方阵模样(将空格替换成‘ 0 ’ ,显示的是notepad++中的格式,更整齐些):

再联系上面的flag长度为24,去掉格式之后剩下18个字符,而且根据 main 函数的过程知道每个字符只能在方阵范围内控制一步,上、下、左、右,看一下图中,从0开始要在符合条件的情况下到达' # '处至少需要18步,和字符数刚好一致,且最短路径唯一,所以结果也唯一,然后在v9这个地方从反编译的代码不是很清楚,看一下汇编代码:

 

 

其实不是同一个变量,一个控制行(定位时 *8),一个控制列,看一下后面的汇编代码容易知道 r14 控制行,即在反编译代码中 &v9 地址中的变量控制了行数, &v9+1 则是列;直接手写,最后的 flag 的 ascii 码值:

111,48,111,111,48,48,79,48,48,48,111,111,111,111,46,46,79,79

得到字符串: o0oo00O000oooo..OO

flag : nctf{o0oo00O000oooo..OO}

 

==

posted @ 2018-06-09 15:12  Bl0od  阅读(460)  评论(0编辑  收藏  举报