关卡1-3 phase1-3
正式进入关卡1,phase_1
首先是关卡1的汇编代码为:
可以看到前3句是非常熟悉的栈开辟代码,下面一起来看一下基本的栈调用过程的汇编代码:在gcc下是AT&T格式的,源操作数,目的操作数
Push %ebp 保存 ebp原有的值,防止被新调用的函数覆盖修改,在退出函数时通过pop ebp 恢。ebp每次调用新的函数,都要开辟新的栈,ebp将会到新的堆栈中 作为寻址的基址,所以每次要先push 将ebp原有的值压入堆栈中保存。
mov %esp,% ebp esp永远指向栈顶,是ebp指向当前栈的栈顶,作为基址,在开辟的堆栈局部空间中,进行寻址。来访问参数和局部变量
sub $0x18,%esp 栈向小地址生长,后压入的在小地址中,开辟一块栈局部空间
mov %ebp,% esp 栈清理
pop %ebp 恢复ebp寄存器
ret 0 ret指令将取出call指令压入的返回地址,跳转过去继续执行
首先找到炸弹爆炸点,可以看到是当调用strings_not_equal函数,当字符串不相等则就会爆炸,看到调用字符串比较函数之前传入的两个参数,第一个参数是放在0x8(%ebp)处,可以推断出应该是我们输入的字符串,第二个参数是在立即数$0x804a15c。这里判断函数传参数时,谁是第一个参数,看出栈顺序,栈是先入先出,先入的在小地址,先出来。此处在%esp处的就是第一个要出栈传递的第一个参数。分析出来之后,第一个关就是一个热身了,很简单,就是查看0x804a15c中的字符串的内容就是我们的通关密码。
在0x8048f6f处设置一个断点,然后查看到0x804a15c中的内容。
这里看到先设置了一个断点,然后在第一关的时候先随便输入一串字符串,然后进行调试,到预设的断点后,在进行查看。
这里可以看到通关的字符串内容就是We have to stand with our North Korean allies.
然后输入之后就可以简单轻松通过关卡1