第六项拆弹集合了1-5所有的内容,所以看起来比较复杂,本文只对此进行分析
地址401106 将数据按顺序入栈。
40117 - 401121 判断输入的第一个数减1是否是无符号<=5的值,因为是无符号,所以输入的每个数必须大于0,不然计算后会得到大于5的值
跳转到401128
eax :0下标的值
这里r12将要存储的是输入数据 1 - 5 的下标,并将值取出来给ebx。
401138 将r12的所代表下标的值与第一个值做不等于比较,以此类推,这里循环做的是,1 - 5下标的值都不等于0下标的值。
这里给r13 + 0x4 后 eax的值就变成下标1了,以此循环。
所以401128 到 401151 这里整体做的事儿是,检查输入的6个值每个数都不能相同。
紧接着跳转到 401153。
这里用7减去 下标 0 - 5 的值,并且用得到的新值替换下标 0 - 5的值。
也就是说如果你输入 1 2 3 4 5 6,那么从rsp开始的值就会变成 6 5 4 3 2 1,。
这是一个坑要注意。
代码刚进入这里rsi被初始化为0了。但是由下面代码知道,rsi存储的依旧是下标序号,只是换了种计算方式。
edx是个地址,是rsp + 0x20 ,也就是输入的值后边,通过 x /30x $rsp 可以查看。
edx每次循环都会增8 是rax给的。
我们要得到6个新值,这几个新值都是地址,会依次放入edx 所指向的位置。
这段代码做的是按照下标 0 - 5 所储存的值作为循环次数。
假如下标0存储的是6,那么就会循环6次得到一个新值,吧这个值放在 (edx,0,8)的位置。以此类推。
如果下标N的值为1,那么就会将0x6032d0 给(edx,N,8)的位置。
注意 rax 存储的始终是 dx+0x8 地址,
4011c0的这里,rcx存储的是原rdx的值,rdx中是新值。 这里是把新值放在(原值所代表的地址+0x8)的位置。这里的作用是用于最终的比较。
这个通过循环得到的地址 + 0x0的位置是一个整数值,最终比较的就是整数值的大小。
这里循环处理得到的6个地址。
4011d2 由于rdx此时是最终的第六个地址,没有后续值了,所以将其 地址+0x8 的位置放入0.
整体意思就是要求每个地址的值 >= 下一个地址的值。
也就是说最终比较的6个降序值。还要注意用7 减序号值得那个坑。
为了保证跳入之前那个坑之后依旧保证我们需要的降序序列。
所以最终输入的是4 3 2 1 6 5。
标签:第六项,csapp,下标,这里,lab1,新值,地址,循环,edx From: https://www.cnblogs.com/thotf/p/17086958.html