Tan's Blog.

Challenge:Phase 2 & Phase 3

字数统计: 507阅读时长: 1 min
2019/04/17 Share

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子程序调用,返回指令

这两道题其实是对循环语句和条件语句的考察,循环和条件语句是非常重要的知识点,写程序时会用到非常多。

CATALOG
  1. 1. Phase 2
    1. 1.1. 解题步骤
  2. 2. Phase 3
    1. 2.1. 解题步骤
  3. 3. 总结