经典Binary Bomb Lab(Phase3)中的逻辑矛盾问题排查
Binary Bomb Lab Phase3 逻辑矛盾问题排查
你大概率是误解了汇编里的条件判断或数值处理逻辑,x86-64下这类“矛盾”几乎都是对指令细节的误读,常见情况和排查方向如下:
混淆有符号/无符号比较:x86-64的条件跳转指令分有符号和无符号版本,比如
jle(有符号≤)和jbe(无符号≤)。如果289是作为8位有符号数处理,它会溢出成-27,这时候和183做有符号比较自然满足≤的条件;但你可能把它当成了32位无符号数来理解,就会觉得矛盾。跳转逻辑搞反:汇编里条件跳转是“满足条件则执行跳转”,如果你把“不跳转才符合要求”的逻辑搞反了,就会误以为需要同时满足两个对立条件。比如代码里如果是
cmp $183, %eax后接jg explode_bomb(大于183就炸),实际要求是≤183;但如果后面的cmp $289, %eax接的是je continue(等于289才继续),那这里才真的矛盾——但这种情况炸弹设计不会出现,所以更可能是你看错了跳转指令的目标(比如把jne explode_bomb看成了je explode_bomb)。数值经过计算而非直接比较:第三个整数可能不是直接和289对比,而是先经过加减、位运算,或者从某个数组取值后再做判断。比如输入值存到
%edx后,执行了mov 0x120(%rdi,%edx,4), %eax,这时候是取数组里的元素和289比较,你可能误把数组元素值当成了输入值。
排查时重点抓这几点:
- 把读取第三个整数到条件判断的汇编片段拆解,盯紧
cmp的操作数、跳转指令的后缀(比如j后面的l/g是有符号,b/a是无符号)。 - 跟踪输入值在寄存器里的变化:有没有
movzx/movsx(符号/零扩展)、add/sub这类修改指令,别把处理后的值当成原始输入值。
内容的提问来源于stack exchange,提问作者CortadoLover
相关产品推荐
相关产品推荐

