欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

lab2 binary bomb 详解

程序员文章站 2022-06-03 14:05:34
...

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

phase_1 

lab2 binary bomb 详解

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

lab2 binary bomb 详解

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

phase_2

lab2 binary bomb 详解lab2 binary bomb 详解

lab2 binary bomb 详解

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

phase_3

lab2 binary bomb 详解

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

lab2 binary bomb 详解

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

phase_4

lab2 binary bomb 详解

lab2 binary bomb 详解

所以知道,输入的第二个数是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

lab2 binary bomb 详解

lab2 binary bomb 详解

使用gdb查看0x804a080起的值:

lab2 binary bomb 详解

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

phase_6

lab2 binary bomb 详解

lab2 binary bomb 详解

lab2 binary bomb 详解

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

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

lab2 binary bomb 详解

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

隐藏关

lab2 binary bomb 详解

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

lab2 binary bomb 详解

lab2 binary bomb 详解

于是查看fun7:

lab2 binary bomb 详解

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

lab2 binary bomb 详解

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

结果截图

lab2 binary bomb 详解

 

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

 

相关标签: binary bomb