观前提示:本文并非速通指南,偏向于如何一步步思考与解题,也许会分析得有些拖沓。且本文为系列文章,每一篇会分析一关的破解思路,前文提到的知识点后面不会赘述,分析过的类似的汇编代码段也不会再分析,除非是没见过的结构,所以越往后分析得越少。
本文共700余字。
前言
如果这些解析对你有帮助,那么我会非常荣幸和开心!
如果我的解析存在错误,非常抱歉误导了你!请在评论区提出!我也是一个正在不断学习的学生。
谢谢你!
正式破解
概览全局
Dump of assembler code for function phase_5:
0x08048d13 <+0>: push %ebx
0x08048d14 <+1>: sub $0x14,%esp
0x08048d17 <+4>: mov 0x1c(%esp),%ebx
0x08048d1b <+8>: push %ebx
0x08048d1c <+9>: call 0x8048f67 <string_length>
0x08048d21 <+14>: add $0x10,%esp
0x08048d24 <+17>: cmp $0x6,%eax
0x08048d27 <+20>: je 0x8048d2e <phase_5+27>
0x08048d29 <+22>: call 0x804907d <explode_bomb>
;输入的字符串长度必须为6 否则爆炸
0x08048d2e <+27>: mov %ebx,%eax
0x08048d30 <+29>: add $0x6,%ebx
0x08048d33 <+32>: mov $0x0,%ecx
;初始化变量操作
;查看内存 发现eax指向字符串开头 ebx指向字符串结尾即‘/0’ ecx=0
0x08048d38 <+37>: movzbl (%eax),%edx
0x08048d3b <+40>: and $0xf,%edx
0x08048d3e <+43>: add 0x804a020(,%edx,4),%ecx
0x08048d45 <+50>: add $0x1,%eax
0x08048d48 <+53>: cmp %ebx,%eax
0x08048d4a <+55>: jne 0x8048d38 <phase_5+37>
;遍历过程中按一定规则累加
0x08048d4c <+57>: cmp $0x1e,%ecx
0x08048d4f <+60>: je 0x8048d56 <phase_5+67>
0x08048d51 <+62>: call 0x804907d <explode_bomb>
;累加结果要等于1e(30) 否则爆炸
关键代码分析
0x08048d38 <+37>: movzbl (%eax),%edx
;之前的文章提过 8位零拓展复制
0x08048d3b <+40>: and $0xf,%edx
;0000 1111 和 当前遍历到的字符的低八位 按位与
;这样保证edx最大值不超过1111即16
0x08048d3e <+43>: add 0x804a020(,%edx,4),%ecx
;换算累加 又是按4字节倍数变动 猜测是数组
0x08048d45 <+50>: add $0x1,%eax ;获取下一个字符
0x08048d48 <+53>: cmp %ebx,%eax ;不等于‘/0’说明没遍历完 继续计算
0x08048d4a <+55>: jne 0x8048d38 <phase_5+37>
确实是数组:
所以就是,我们的每个字符的ascii码会取低8位然后和00001111按位与被转换成16以内的数字,再与数组里的16个密码数字匹配得到数字,这些数字累加要等于30。
可以倒推,举一个例子,30可以由444666这6个数字相加得到,4对应array[8],所以我们的字符低八位 & 0xf 是等于8 ,低四位就是1000,5~8位无所谓,反正&0都会得0。为了输入方便,我直接凑成0110 1000 即小写字母h。
同理,6对应array[2],所以低四位就是0010,凑成0110 1000 即小写字母b。
还原成C代码
int array[16]={……};//懒得写 这个应该在炸弹初始化函数里
void phase_5(char *input){
int strLen = string_length(input);
if(strLen == 6){
int sum = 0;
while(input){
int num = (*input) & 0xf; // 仅保留低4位的值
sum += array[num];
input++;
}
if(sum == 30){
return ;
}
}else{
explode_bomb();
}
explode_bomb();
}
后记
感谢你看到这里!