lab2 binary bomb 详解
1、objdump–d bomb > asm.txt 对bomb反汇编,将汇编代码输出到asm.txt;看汇编代码。
phase_1
比较地址0x804a004和输入的字符串是否匹配。于是查看0x804a004处:
答案为We have to stand with our North Korean allies.
phase_2
phase_2判断第一个参数是否为1,是则判断后一个参数是否是前一个参数的两倍,循环直至判断到最后一个参数。故而答案应该是1 2 4 8 16 32
phase_3
所以gdb模式,设置断点phase_3,设定参数1 100,用ni单步调试,在执行0x8048c36后用info reg指令查看寄存器状况,eax中放的值就是第二个参数的值。
将0到7一个个尝试过来,得到正确答案有0 890 或1 125或2 491或3 489 或4 769 或5 368或6 379或7 448。
phase_4
所以知道,输入的第二个数是18(0x12),第一个数在理解了题意之后,写了一个c程序去解出答案。代码如下:
#include <stdio.h>
int func4(int a1,int a2,int a3)
{
int result;
result=(a3-a2)/2+a2;
if(result>a1)
return result+func4(a1,a2,result-1);
if(result<a1)
result=result+func4(a1,result+1,a3);
return result;
}
int main()
{
int value=0;
for(;value<=14;value++)
{
if(func4(value,0,14)==18)
printf("the value is %d\n",value);
}
return 0;
}
得到11。所以答案11 18。
phase_5
使用gdb查看0x804a080起的值:
要满足相加为33,所以随便凑了一下,选择了0x2+0xa+0x6+0x10+0x4+0xd=0x33.它们所在的位置对应的edx的值应该是0,1,2,5,8,15,去ASCII码表中找到对应的字符,低四位的值满足要求,比如pabeho测试正确。
phase_6
第六关感觉比较复杂,就是一个是输入的时候六个数是1 2 3 4 5 6的一个排序,这样子避免bomb,还有一个就是从0x8048e17处开始的一段指令,根据前面的指令,我觉得就是相当于,先设置一个数组a[6],i是我们输入的第k个数字,b=0x804c13c,while(--i){b=M[0x804c13c+0x8+12*i]},存到数组a[k-1]中,数组实现后,然后将M[a[0]+0X8]处放置a[1],再是M[a[1]+0x8]处放置a[2],这样子推下去,构成了链表。就是说原来的链表是node1->node2->node3->node4->node5->node6,如果我们输入的数字是3 2 1 4 6 5,链表变成node3->node2->node1->node4->node6->node5再然后就是在将每个链表中的数据进行比较,因为在前面的指令中每个链表的信息都被放到了新的地址,也就相当于每次比较M[a[i]+0x4]与M[M[a[i]+0x8]+0x4],所以gdb,输入1 2 3 4 5 6,等到进入0x8048e17,0x8048e1a,0x8048elc的时候,info reg,观察eax和ebx的值。
在0x8048elc处:
由前面那些循环指令可以知道链表每个结点的信息,所以查看内存,得到
node1的数值为0x3e0,node2的数值为0x2da,node3为0xc2,node4为0x244,node5为0x27a,node6为0x36f。然后排序得到答案是3 4 5 2 6 1
隐藏关
查看0x804a232,推测输入的字符串为DrEvil,测试正确进入隐藏关。
于是查看fun7:
为了使得返回secret_phase时的eax=0,所以0x8048e54和0x8048e76的跳转永远不成功。根据指令,我们可以知道应该是在M[0x804c088]开始的内存中,然后读取M[0x804c088+4],下一个值在M[M[0x804c088+4]]处,每次读取的内存数值(不是指地址的内存)都大于我们输入的十进制数,直到有一个数它和我们输入的十进制数相等,也就是说运算是2*2*2*…2*(0),于是用gdb查看内存:
得到答案是0x24或者0x8或者0x6或者0x1。
结果截图
其实用ida就可以半小时解决bomb lab
上一篇: 复习记忆PE导入导出表