Microcorruptioin 第一关 Tutorial
首先进入Tutorial这一关,这是闯关页面。
在主函数设置断点,控制台输入"break main"或"b main"或手动点击反汇编栏中main函数的第一行设置断点。
该闯关游戏主要是破解密码,查看主函数中的重要步骤,发现check_password函数是关键点,在check_password函数中设置断点。
接着控制台输入"c"继续执行程序,此时程序弹出输入框要求输入密码,这里我们先输入"test"进行测试,点击"send"。
接着我们看到程序进入了一个陌生的函数,我们在控制台逐步输入"f"推出当前函数,直到程序跳回main函数。
输入"s"或"step"逐步执行指令,进入check_password函数,函数的第一条指令mov.b @r15,r14的含义是将寄存器r15的值逐个byte传送到r14中,查看r15寄存器的内容,发现是地址439c,查看内存中439c的内容,是十六进制的"7465 7374",即我们输入的"test"的ASCII码值,我们输入的密码存储在了r15中。
继续逐步执行指令,inc r15指令令r15的值加1,同样inc r12指令令r12的值加1,接着判断r14的值是否为0,不为0则跳转到<check_password+0x0>地址中,即返回check_password函数开头。
执行jnz指令后返回check_password函数开头,继续刚才的步骤。
当程序不再返回check_password函数开头时,此时r14的值为0,r12的值为5,代表r12记录了我们输入的密码的位数(其中包括一个’\0’),接着我们分析程序,将r12的值和9比较,如果相等的话则跳转到4498,令r15等于0;否则程序继续向下执行4494,clr r15的含义是给r15清零。
我们继续向下执行,程序返回到了主函数,在主函数中判断r15的值是否为0,如果为0则跳转到输入密码不合法的指令,否则输出密码正确,说明check_password函数的返回值直接影响密码是否正确,要令密码正确,则r15的值要为1,则r12的值要等于9,于是我们可以判断正确的密码有8位。
输入"c"继续运行程序,程序运行结束,此时I/O控制台输出密码错误信息,说明"test"不是正确密码。
在控制台输入"unbreak main"和"unbreak check_password"取消刚才设置的断点,或手动取消,我们输入"reset"重启程序,这次我们输入正确的密码测试。
我们任意输入8位密码"12345678"进行测试,大门成功打开,密码正确!
我们输入另外一个8位密码"password"测试,同样成功打开大门!
最后我们在控制台输入"solve",输入8位密码,成功通关!