南邮攻防训练平台逆向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}
==
本文来自博客园,作者:Bl0od
转载请注明原文链接:https://www.cnblogs.com/zUotTe0/p/9159592.html