首先还是栈指针自减和%rbx入栈
而后将第一个参数的值放入%rbx
再有在%eax中设置了一个哨兵防止越界
而后将%rax中的值放入0x18(%rsp)
接着%eax ^= %eax
然后调用函数<string_length>,将返回值与6比较,如果字符串的长度为6就跳转,否则就爆炸
跳转之后将0放入%eax,再无条件跳转至0x40108b执行
movzbl (%rbx,%rax,1),%ecx
因为%rax里面为0,所以%ecx=%rbx等于第一个参数即输入值
然后的意思应该是把字符串的字符从头将输入值的第一个字节放入栈指针,再放入(%rdx)并与0xf做与运算,即取%edx的低四位
总结运算,就是把输入值的第%rax个偏移位的字符的低4位放入%edx,而%rbx存放的是我们输入的字符串的地址,然后%rax是索引,每次从我们输入的字符串取出一个字符后,只取最低4位存放在%edx中,然后这个%edx被用做了从长字符串取字符的索引
下面两行中,将地址0x4024b0+%rdx中的一个字节放入%edx的低16位中。然后将这16位复制到了%rsp+0x10+%rax的位置中
随后%rax+=1,与6作比较,不等于6就循环执行上面运算操作,即遍历整个字符串执行上面的操作
通过读取0x4024b0可以看到索引表
继续看下面的代码找到,将操作后的字符串放进了0x10(%rsp)再放进了第一参数,而比较的目标为第二参数里面存的值
通过读取内存0x40245e
得到要在0x4024b0中索引获得的字符串为flyers,结合上面,可以看见
字符f l y e r s的索引分别为9 15 14 5 6 7
所以要输入字符串的低4位要分别为十进制的9 15 14 5 6 7
所以在ascii码表里随便找6个低4位分别为1001,1111,1110,0101,0110和0111的字符就行