lab2 binary bomb 详解

1、objdump–d bomb > asm.txt 对bomb反汇编,将汇编代码输出到asm.txt;看汇编代码。

phase_1 

lab2 binary bomb 详解_第1张图片

比较地址0x804a004和输入的字符串是否匹配。于是查看0x804a004处:

lab2 binary bomb 详解_第2张图片

答案为We have to stand with our North Korean allies.

phase_2

lab2 binary bomb 详解_第3张图片lab2 binary bomb 详解_第4张图片

lab2 binary bomb 详解_第5张图片

phase_2判断第一个参数是否为1,是则判断后一个参数是否是前一个参数的两倍,循环直至判断到最后一个参数。故而答案应该是1 2 4 8 16 32

phase_3

lab2 binary bomb 详解_第6张图片

所以gdb模式,设置断点phase_3,设定参数1 100,用ni单步调试,在执行0x8048c36后用info reg指令查看寄存器状况,eax中放的值就是第二个参数的值。

lab2 binary bomb 详解_第7张图片

将0到7一个个尝试过来,得到正确答案有0 890 或1 125或2 491或3 489 或4 769 或5 368或6 379或7 448。

phase_4

lab2 binary bomb 详解_第8张图片

lab2 binary bomb 详解_第9张图片

所以知道,输入的第二个数是18(0x12),第一个数在理解了题意之后,写了一个c程序去解出答案。代码如下:

#include 
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

得到11。所以答案11 18。

phase_5

lab2 binary bomb 详解_第10张图片

lab2 binary bomb 详解_第11张图片

使用gdb查看0x804a080起的值:

lab2 binary bomb 详解_第12张图片

要满足相加为33,所以随便凑了一下,选择了0x2+0xa+0x6+0x10+0x4+0xd=0x33.它们所在的位置对应的edx的值应该是0,1,2,5,8,15,去ASCII码表中找到对应的字符,低四位的值满足要求,比如pabeho测试正确。

phase_6

lab2 binary bomb 详解_第13张图片

lab2 binary bomb 详解_第14张图片

lab2 binary bomb 详解_第15张图片

第六关感觉比较复杂,就是一个是输入的时候六个数是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处:

lab2 binary bomb 详解_第16张图片

由前面那些循环指令可以知道链表每个结点的信息,所以查看内存,得到

lab2 binary bomb 详解_第17张图片

node1的数值为0x3e0,node2的数值为0x2da,node3为0xc2,node4为0x244,node5为0x27a,node6为0x36f。然后排序得到答案是3 4 5 2 6 1

隐藏关

lab2 binary bomb 详解_第18张图片

查看0x804a232,推测输入的字符串为DrEvil,测试正确进入隐藏关。

lab2 binary bomb 详解_第19张图片

lab2 binary bomb 详解_第20张图片

于是查看fun7:

lab2 binary bomb 详解_第21张图片

为了使得返回secret_phase时的eax=0,所以0x8048e54和0x8048e76的跳转永远不成功。根据指令,我们可以知道应该是在M[0x804c088]开始的内存中,然后读取M[0x804c088+4],下一个值在M[M[0x804c088+4]]处,每次读取的内存数值(不是指地址的内存)都大于我们输入的十进制数,直到有一个数它和我们输入的十进制数相等,也就是说运算是2*2*2*…2*(0),于是用gdb查看内存:

lab2 binary bomb 详解_第22张图片

得到答案是0x24或者0x8或者0x6或者0x1。

结果截图

lab2 binary bomb 详解_第23张图片

 

其实用ida就可以半小时解决bomb lab

 

你可能感兴趣的:(PA,and,Lab)