Phase 2
解题步骤
从call read_six_numbers看出调用了一个读取六个数字的函数,所以这道题的输入应该是6个数。继续分析,发现0x18(%esp)存放第一个数,需要等于1。跳转至8048bf2,进行取地址操作,接下来就进入了一个循环中,从循环中分析得出下一个数总等于前一个数自身相加的和。当读完第六个数后,循环条件不成立,结束循环。
那通过上面的分析过程可以得出输入的6个数,进行输入。
Phase 3
解题步骤
从代码中可以看到调用8048860 <__isoc99_sscanf@plt>来获取输入参数,查看一下需要输入的参数
为两个整型数,接下来将第一个数与1比较,小于等于1会爆炸;再和7比较,大于7会爆炸,所以得出第一个数的区间为(1,7]。
jmp 0x804a180(,%eax,4) //该指令跳转到它的值位于为%EAX 4 + 0x804a180
那我选择的第一个数为4,经过上式的运算查询到跳转地址
进行一些基本的运算后,得出%eax=0,也就是第二个数。同时发现对第一个数再加一个限制要小于等于5,所以第一个数的区间为(1,5],而4符合,进行输入。
总结
今天对汇编语言进行一个了解,下面是今天用到的汇编指令的总结
操作名称 | 作用 |
---|---|
MOV | 把源操作数送给目的操作数 |
JE | 相等跳转 |
JA | 高于跳转 |
PUSH | 把操作数压入堆栈 |
POP | 把操作数取出堆栈 |
LEA | 取地址至寄存器 |
ADD | 加法指令 |
SUB | 减法指令 |
JMP | 跳往指定地址执行 |
CMP | 比较指令 |
CALL | 子程序调用,返回指令 |
这两道题其实是对循环语句和条件语句的考察,循环和条件语句是非常重要的知识点,写程序时会用到非常多。