• Pediy CTF 2018 reverse


    关键点:

    00401043  |.  8D7C24 20     |lea edi,dword ptr ss:[esp+0x20]                    ;  edi存储假码ASCII的位置
    00401047  |.  83C9 FF       |or ecx,-0x1                                        ;  略过
    0040104A  |.  33C0          |xor eax,eax                                        ;  略过
    0040104C  |.  83C4 0C       |add esp,0xC                                        ;  恢复堆栈
    0040104F  |.  F2:AE         |repne scas byte ptr es:[edi]
    00401051  |.  F7D1          |not ecx
    00401053  |.  49            |dec ecx
    00401054  |.  83F9 11       |cmp ecx,0x11                                       ;  比较输入的假码的数量是否超过17个字符
    00401057  |.  0F87 B0000000 |ja 18a51cbc.0040110D                               ;  超过的直接报错
    0040105D  |.  33DB          |xor ebx,ebx                                        ;  清空ebx
    0040105F  |>  8A441C 14     |/mov al,byte ptr ss:[esp+ebx+0x14]                 ;  拿到假码的第一个字节
    00401063  |.  84C0          ||test al,al                                        ;  判断拿到的是否为空
    00401065  |.  74 49         ||je short 18a51cbc.004010B0                        ;  是的话 则跳转
    00401067  |.  0FBEC8        ||movsx ecx,al                                      ;  把假码赋值给ecx
    0040106A  |.  51            ||push ecx                                          ;  把ecx压入堆栈
    0040106B  |.  8D5424 16     ||lea edx,dword ptr ss:[esp+0x16]                   ;  存储假码的地址赋值给edx
    0040106F  |.  68 44804000   ||push 18a51cbc.00408044                            ;  %x
    00401074  |.  52            ||push edx
    00401075  |.  E8 68020000   ||call 18a51cbc.004012E2
    0040107A  |.  8D7C24 1E     ||lea edi,dword ptr ss:[esp+0x1E]                   ;  存储假码的第一个数的地址赋值给edi
    0040107E  |.  83C9 FF       ||or ecx,-0x1                                       ;  使ecx为FFFFFFFF
    00401081  |.  33C0          ||xor eax,eax                                       ;  清空eax
    00401083  |.  83C4 0C       ||add esp,0xC                                       ;  恢复堆栈
    00401086  |.  F2:AE         ||repne scas byte ptr es:[edi]
    00401088  |.  F7D1          ||not ecx
    0040108A  |.  2BF9          ||sub edi,ecx                                       ;  把存储当前假码的字节地址赋值给edi
    0040108C  |.  8D5424 28     ||lea edx,dword ptr ss:[esp+0x28]                   ;  空内存地址赋值给edx
    00401090  |.  8BF7          ||mov esi,edi                                       ;  假码赋值给esi
    00401092  |.  8BE9          ||mov ebp,ecx
    00401094  |.  8BFA          ||mov edi,edx
    00401096  |.  83C9 FF       ||or ecx,-0x1
    00401099  |.  F2:AE         ||repne scas byte ptr es:[edi]
    0040109B  |.  8BCD          ||mov ecx,ebp
    0040109D  |.  4F            ||dec edi
    0040109E  |.  C1E9 02       ||shr ecx,0x2                                       ;  ecx右移两位
    004010A1  |.  F3:A5         ||rep movs dword ptr es:[edi],dword ptr ds:[esi]
    004010A3  |.  8BCD          ||mov ecx,ebp
    004010A5  |.  83E1 03       ||and ecx,0x3
    004010A8  |.  43            ||inc ebx                                           ;  开始计数 自增1
    004010A9  |.  83FB 11       ||cmp ebx,0x11                                      ;  比较是否为0x11
    004010AC  |.  F3:A4         ||rep movs byte ptr es:[edi],byte ptr ds:[esi]      ;  把假码的十六进制字节赋值给edi的地址中的值
    004010AE  |.^ 7C AF         |jl short 18a51cbc.0040105F
    004010B0  |>  8D7424 4C     |lea esi,dword ptr ss:[esp+0x4C]                    ;  esi存储真码的值
    004010B4  |.  8D4424 28     |lea eax,dword ptr ss:[esp+0x28]                    ;  eax存储假码的值
    004010B8  |>  8A10          |/mov dl,byte ptr ds:[eax]                          ;  dl存储真码的第一个字节
    004010BA  |.  8A1E          ||mov bl,byte ptr ds:[esi]                          ;  bl存储假码的第一个字节
    004010BC  |.  8ACA          ||mov cl,dl                                         ;  假码放到cl
    004010BE  |.  3AD3          ||cmp dl,bl                                         ;  比较真码和假码,都为一字节
    004010C0  |.  75 1E         ||jnz short 18a51cbc.004010E0                       ;  错误则跳
    004010C2  |.  84C9          ||test cl,cl                                        ;  检查cl是否为空
    004010C4  |.  74 16         ||je short 18a51cbc.004010DC
    004010C6  |.  8A50 01       ||mov dl,byte ptr ds:[eax+0x1]
    004010C9  |.  8A5E 01       ||mov bl,byte ptr ds:[esi+0x1]
    004010CC  |.  8ACA          ||mov cl,dl
    004010CE  |.  3AD3          ||cmp dl,bl
    004010D0  |.  75 0E         ||jnz short 18a51cbc.004010E0
    004010D2  |.  83C0 02       ||add eax,0x2
    004010D5  |.  83C6 02       ||add esi,0x2
    004010D8  |.  84C9          ||test cl,cl
    004010DA  |.^ 75 DC         |jnz short 18a51cbc.004010B8
    004010DC  |>  33C0          |xor eax,eax
    004010DE  |.  EB 05         |jmp short 18a51cbc.004010E5
    004010E0  |>  1BC0          |sbb eax,eax
    004010E2  |.  83D8 FF       |sbb eax,-0x1
    004010E5  |>  85C0          |test eax,eax
    004010E7  |.  75 12         |jnz short 18a51cbc.004010FB
    004010E9  |.  68 38804000   |push 18a51cbc.00408038                             ;  success!
    
    004010EE  |.  E8 58020000   |call 18a51cbc.0040134B
    004010F3  |.  83C4 04       |add esp,0x4
    004010F6  |.^ E9 1FFFFFFF   |jmp 18a51cbc.0040101A
    004010FB  |>  68 30804000   |push 18a51cbc.00408030                             ;  wrong!
    
    00401100  |.  E8 46020000   |call 18a51cbc.0040134B
    
  • 相关阅读:
    Effective_STL 学习笔记(四十) 使仿函数类可适配
    Effective_STL 学习笔记(三十九) 用纯函数做判断式
    PMP考试大纲
    小技巧
    git 常用命令
    java web的返回值对象
    工作任务-SM敏捷核心思维
    树莓派上手
    spring 公用异常处理
    前端现在版本怎么这么乱
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/12305948.html
Copyright © 2020-2023  润新知