设为首页 加入收藏

TOP

二进制炸弹(第二次实验)(三)
2016-04-27 17:25:30 来源: 作者: 【 】 浏览:725
Tags:二进制 炸弹 第二 实验

: lea -0x8(%ebp),%eax 8048d7a: push %eax /s/ 8048d7b: call 8049030 8048d80: add $0x10,%esp 8048d83: test %eax,%eax 8048d85: je 8048d8c /字符串相等,return/ 8048d87: call 80494fc ...

上面的代码是比较s和pattern是否相同,如果不相同,引爆;同样利用gdb可以知道pattern的值是”giant”。
等价c代码为:

char p[17]="isrveawhobpnutfg";
void phase_5(char *input)
{
    char s[7];
    if (string_length(input)!=6)
        explode_bomb();
    for (int edx=0;edx<=5;edx++)
    {
        int eax=(int)(input[edx]&0xf);
        s[edx]=p[eax];
    }
    s[7]='\0';
    if (strings_not_equal(s,"giants"))
        explode_bomb();
}

由此我们知道:input[edx]必须从下面取值,最后的,最后取任意组合即可:

edx 0 1 2 3 4 5
ASCII 0x_f 0x_0 0x_5 0x_b 0x_d 0x_1
字符 /,,O,_,o 0, ,@,P,`,p %,5,E,U,e,u +,;,K,[,k,{ -,=,M,],m,} !,1,A,Q,a,q

阶段六

用gdb查看0x804b26c附近的内容:

(gdb) x/20x 0x804b26c
0x804b26c 
   
    : 0x000000fd 0x00000001 0x0804b260 0x000003e9 ...(省略)
   

根据之后的代码和第3个值,推测node1的类型是结构,其中有一个指针,顺着这个指针继续查找:

(gdb) x/20x 0x804b260
0x804b260 
   
    : 0x000002d5 0x00000002 0x0804b254 0x000000fd ...(省略)
   

可以确定结构由三个元素组成,两个整形数据,一个结构类型的指针,重复操作可以发现这是一个有6个元素的链表,称此结构为node,此时的链表为:

node(1)->node(2)->node(3)->node(4)->node(5)->node(6)->NULL

下面分析代码:

08048d98 
   
    : ... 8048db1: push %eax /num/ 8048db2: push %edx /input/ 8048db3: call 8048fd8 
    
      ...
    
   

从input中读6个数到num[]中,接着:

08048d98 
   
    : ... 8048db8: xor %edi,%edi /edi=0/ 8048dba: add $0x10,%esp 8048dbd: lea 0x0(%esi),%esi .loop 8048dc0: lea -0x18(%ebp),%eax /eax=num/ 8048dc3: mov (%eax,%edi,4),%eax 8048dc6: dec %eax /eax=num[edi]-1/ 8048dc7: cmp $0x5,%eax 8048dca: jbe 8048dd1 
    
      8048dcc: call 80494fc 
     
       /确保num[edi]<=6/ 8048dd1: lea 0x1(%edi),%ebx 8048dd4: cmp $0x5,%ebx /保证第一次内循环ebx<=5/ 8048dd7: jg 8048dfc 
      
        8048dd9: lea 0x0(,%edi,4),%eax /eax=4*edi/ 8048de0: mov %eax,-0x38(%ebp) /保存eax/ 8048de3: lea -0x18(%ebp),%esi /esi=num/ .loop1 8048de6: mov -0x38(%ebp),%edx /edx=4*edi/ 8048de9: mov (%edx,%esi,1),%eax /eax=num[edi]/ 8048dec: cmp (%esi,%ebx,4),%eax /比较num[edi]和num[edx]/ 8048def: jne 8048df6 
       
         8048df1: call 80494fc 
        
          /确保两者不相等/ 8048df6: inc %ebx 8048df7: cmp $0x5,%ebx 8048dfa: jle 8048de6 
         
           goto .loop1 8048dfc: inc %edi 8048dfd: cmp $0x5,%edi 8048e00: jle 8048dc0 
          
            goto .loop ...
          
         
        
       
      
     
    
   

这个二重循环的作用一是保证(unsigned)(num[edi]-1)<6,由补码数和无符号数转换关系知这样可以确保num[edi]为正且<7;另一作用是保证num中元素两两互异,接着:

08048d98 
   
    : ... 8048e02: xor %edi,%edi /edi=0/ 8048e04: lea -0x18(%ebp),%ecx /ecx=num/ 8048e07: lea -0x30(%ebp),%eax /eax=p/ 8048e0a: mov %eax,-0x3c(%ebp) /保存eax/ 8048e0d: lea 0x0(%esi),%esi .loop 8048e10: mov -0x34(%ebp),%esi /esi=&node1/ 8048e13: mov $0x1,%ebx /ebx=1/ 8048e18: lea 0x0(,%edi,4),%eax /eax=4edi/ 8048e1f: mov %eax,%edx /edx=4edi/ 8048e21: cmp (%eax,%ecx,1),%ebx /判断第一次内循环是否执行/ 8048e24: jge 8048e38 
    
      /ebx>=num[edi]/ 8048e26: mov (%edx,%ecx,1),%eax /ebx
     
      next/ 8048e33: inc %ebx 8048e34: cmp %eax,%ebx 8048e36: jl 8048e30 
      
        /ebx
       
         goto .loop ...
       
      
     
    
   

上述二重循环的功能是使p[edi]为指向node(num[edi])的指针,接着:

08048d98 
   
    : ... 8048e44: mov -0x30(%ebp),%esi /esi=p[0]/ 8048e47: mov %esi,-0x34(%ebp) /保存esi/ 8048e4a: mov $0x1,%edi /edi=1/ 8048e4f: lea -0x30(%ebp),%edx /edx=p/ .loop 8048e52: mov (%edx,%edi,4),%eax /eax=p[edi]/ 8048e55: mov %eax,0x8(%esi) /esi->next=p[edi]/ 8048e58: mov %eax,%esi /esi=p[edi]/ 8048e5a: inc %edi 8048e5b: cmp $0x5,%edi 8048e5e: jle 8048e52 
    
      goto .loop 8048e60: movl $0x0,0x8(%esi) /node(num[5]).next=NULL/ ...
    
   

上述循环的功能是使node(num[edi]).next=&node(num[edi+1]),此时的链表为:

node(num[0])->node(num[1])->node(num[2])->node(num[3])->node(num[4])->node(num[5])->NULL

接着进入下一个循环:

08048d98 
   
    : ... 8048e67: mov -0x34(%ebp),%esi /esi=p[0]=&node(num[0])/ 8048e6a: xor %edi,%edi /edi=0/ 8048e6c: lea 0x0(%esi,%eiz,1),%esi /esi=esi/ .l
首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇OpenCV实践之路――行人检测 下一篇C++学习笔记之四 复合类型1

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

最新文章

热门文章

C 语言

C++基础

windows编程基础

linux编程基础

C/C++面试题目