Stack Overflows for Beginners: 1这个靶机还剩下三个flag没有拿到,继续加油。
还是一样,用level2和昨天拿到的密码登录系统,随意传入一个字符串来测试一下levelThree这个程序,执行之后回显我输入的字符串,看起来和上一个任务差别不大。
还是用老方法,edb执行levelThree,并传入参数,开始分析程序执行流程,可以看到在5655623f处调用了levelThree!overflow这个过程,设置断点并继续分析。
levelThree!overflow这个过程中又调用了strcpy过程,那就还利用strcpy来溢出总没错。这里要注意一下返回主程序的地址已经被压入栈(地址ffffd2fc,值为56556244),这就是要覆盖的目的地址,记下来备用。
在printf前设置断点,并继续执行,可以看到strcpy执行之后,传入的字符串已经被复制到了栈中(下图红框中的内容)
利用字符串的起始地址ffffd1f0和之前记下来的ffffd2fc可以计算出需要填充的数据长度为268字节。
接下来利用脚本生成268个A,再加上4个B做为输入参数来验证是否可以将程序跳转到42424242处。
打开edb,在调用levelThree!overflow后,查看栈顶,地址为ffffd1fc,其值目前为正确值56556244。
在levelThree!overflow执行ret指令之前设置断点并继续执行程序,留意填充字符串的启始这址,并记下备用(地址为ffffd0f0,当把填充替换为shellcode时,需要跳转到此处执行shellcode)
在到刚才的ffffd1fc处验证其值,可以看出已经被覆盖为42424242了,这就说明计算正确。
利用python将shellcode和填充字符以及返回地址生成为新的填充字符。也可以叫它payload。自行程序,并将payload做为输入参数。
用edb验证,可以看到shellcode已经被写入到ffffd0f0处。
再到ffffd1fc处查看其值,已经被修改为ffffd0f0,也就是shellcode的地址。理论上已经成功了。
执行levelThree,将payload传入,成功获得level3的shell。第三个flag成功拿到!