X-CTF(REVERSE入门) maze

之前文章讲过的技巧和知识,就不再详细描述了,如果有不明白的地方建议按照做题题目顺序查看。

这道题无疑是入门题里最难的,程序运行内容和题目提示的‘迷宫’没有关系


图1

找到关键代码,发现v5有四种情况O o . 0,每种情况对应一个函数,执行完函数后goto_LABEL_14。

输入O,因为(*a1) - 1,所以位置往前移动1位

输入o,因为*(a1+ 1),所以位置往后移动8位

输入 . ,因为(*a1)-1 ,所以位置往前移动1位

输入0,因为*(a1+1),所以位置往后移动8位

这里的移动后来知道是错误分析。。因为后面做不出来了,反编译代码看的头大也不知道是不是反编译错了这里,看下汇编吧

可以看出sub_400650、sub_400660、sub_400670、sub_400680将改变的内容放回[rdi]

追踪xref

sub_400650、sub_400660的[rdi]来自于r15

sub_400670、sub_400680的[rdi]来自于r14

追踪xref找到r14和r15的地址来自于堆栈,普通放数据的地方,和题目没有多大关系

r14、r15是堆栈的上下两行所指向的数据

回到四个函数,继续往下分析运算差别一个是lea ecx, [rax-1]一个是inc eax

inc eax不用说eax加1

lea ecx, [rax-1]追踪看看rax-1是什么

进入sub_400690函数,rax是栈顶+28h+var_28+4,rdi是ASCII字符串,edx是栈顶+28g+var_28。

20h是‘ ’,23h是‘#’,把rax+rcx*8加到eax里,而eax又是rax的32位,所以rax是个循环里变化的值

ok,和[rax-1]没有关系,sub_400650、sub_400660的汇编一样都是r15,所以他们对位置的改动是一样的距离跨度为1,sub_400670、sub_400680的汇编一样都是r14所以他们对位置的改动是一样的距离跨度为8。

既然知道了四个函数的距离跨度,总结一下:

O是前移1位(左),o是后移1位(右),.是前移8位(上),0是后移8位(下)

通过流程图可以看出四个函数与r14、r15有关

将移动的位置传入ASCII码中,查看当前位置的ASCII码是什么符号

如果改变的值在ASCII码“ ******* * **** * **** * *** *# *** *** *** *********”里等于‘ ’或‘#’那么return真,如果不是等于这么多就继续按照输入的下一个字符串是什么移动位置

(注意8LL*a3是将r14地址所指向的值*8)


图3

如果是真往下判断,是‘#’,那么输入的为正确的flag,前提是输入24个字符串,前五个为‘nctf{’,后一个为‘}’

提供的ASCII字符串共有64位,我们8个换一行排版得到如下图案


图4

不能碰到*,因为只允许移动到‘ ’和‘#’程序才不会break

所以此题迷宫的意思就是让你在图案空白里走18步,走到‘#’

不用写代码,算了一下一步步往‘#’走刚好18步

所以对应的顺序应该是o0oo00O000oooo..OO



原文地址:https://www.cnblogs.com/blackicelisa/p/12263625.html