phase_3
汇编指令
- jg 有符号大于则跳转
- ja 无符号大于则跳转
- je 等于则跳转
解题过程
- 首先弄清楚要输入的字符串是什么类型,使用断点功能,得到解题所需的字符分别为整型、字符、整型共三个字符。
-
按照解题惯例,直接跳转到call 8048860 __isoc99_sscanf@plt处继续研究代码。
-
由此段代码猜测,第一个数是个大于等于2、小于等于7的数。
-
继续向下分析。jmp *0x804a260(,%eax,4)调用了一个switch case开关。每一段00标志下都为一段case,共6段。
-
查看了所有的case段后,发现最后字符应该都是存储到%eax里面,故因此往回找线索。
-
发现两个指令,分别是 mov $0x75,%eax和cmpl $0x1d7,0x2c(%esp)
- 前者是16进制数,猜测其存储的就是那个字符,并猜测是ASCII码,查表后发现是u。
- 后者决定了如果不等于0x1d7,则直接爆炸,故后者为第三个整型,转化为十进制为471.
- 由于之前猜测第一个数的范围是2-7,故一个个进行尝试,发现全部错误,因此猜测错误。
-
由于三个数分别是整型、字符、整型,因此在上面两个指令前寻找线索,发现jmp *0x804a260(,%eax,4)指令中括号里面是三个数,可以与要输入的结果对应上,并且第一个数没有进行声明,由于整型的默认值为0,因此,猜测第一个值为0,故进行尝试。
-
结果正确。
再考虑其他方法验证第一个数,使用断点功能找到8048c52点处eax寄存器内的值。