[DASCTF Sept 2021]ea5ycpp

直接爆破

  1. 根据start入口定位到main函数,看到了一些被赋值的元数据:

    .text:00005652C48B552D                 mov     [rdx], al
    .text:00005652C48B552F                 add     rdx, 1          ; Add
    .text:00005652C48B5533                 mov     byte ptr [rbp-120h], 68h ; 'h'
    .text:00005652C48B553A                 mov     byte ptr [rbp-11Fh], 6Fh ; 'o'
    .text:00005652C48B5541                 mov     byte ptr [rbp-11Eh], 65h ; 'e'
    .text:00005652C48B5548                 mov     byte ptr [rbp-11Dh], 6Ch ; 'l'
    .text:00005652C48B554F                 mov     byte ptr [rbp-11Ch], 81h
    .text:00005652C48B5556                 mov     byte ptr [rbp-11Bh], 69h ; 'i'
    .text:00005652C48B555D                 mov     byte ptr [rbp-11Ah], 7Ah ; 'z'
    .text:00005652C48B5564                 mov     byte ptr [rbp-119h], 3Dh ; '='
    .text:00005652C48B556B                 mov     byte ptr [rbp-118h], 3Bh ; ';'
    .text:00005652C48B5572                 mov     byte ptr [rbp-117h], 79h ; 'y'
    .text:00005652C48B5579                 mov     byte ptr [rbp-116h], 6Bh ; 'k'
    .text:00005652C48B5580                 mov     byte ptr [rbp-115h], 73h ; 's'
    .text:00005652C48B5587                 mov     byte ptr [rbp-114h], 38h ; '8'
    .text:00005652C48B558E                 mov     byte ptr [rbp-113h], 39h ; '9'
    .text:00005652C48B5595                 mov     byte ptr [rbp-112h], 7Bh ; '{'
    .text:00005652C48B559C                 mov     byte ptr [rbp-111h], 70h ; 'p'
    .text:00005652C48B55A3                 mov     byte ptr [rbp-110h], 7Bh ; '{'
    .text:00005652C48B55AA                 mov     byte ptr [rbp-10Fh], 48h ; 'H'
    .text:00005652C48B55B1                 mov     byte ptr [rbp-10Eh], 73h ; 's'
    .text:00005652C48B55B8                 mov     byte ptr [rbp-10Dh], 7Ch ; '|'
    .text:00005652C48B55BF                 mov     byte ptr [rbp-10Ch], 85h
    .text:00005652C48B55C6                 mov     byte ptr [rbp-10Bh], 47h ; 'G'
    .text:00005652C48B55CD                 mov     byte ptr [rbp-10Ah], 7Ch ; '|'
    .text:00005652C48B55D4                 mov     byte ptr [rbp-109h], 96h
    .text:00005652C48B55DB                 lea     rax, [rbp-160h] ; Load Effective Address
    .text:00005652C48B55E2                 mov     rdi, rax
    
  2. 查看逆向代码:

    image

    这段都是STL库函数操作,因此比较复杂。我们试图略过这些代码,因为他们太复杂
    (其实可以看到这些库函数操作都相同,并且重复了24次——正好是flag的长度)

     	std::allocator<char>::allocator(&v11);
        std::__cxx11::basic_string<char,std::char_traits<char>,std::allocator<char>>::basic_string();
        sub_5652C48B6876(v13, v15);
        std::__cxx11::basic_string<char,std::char_traits<char>,std::allocator<char>>::~basic_string(v15);
        std::allocator<char>::~allocator(&v11);
        sub_5652C48B6936(v13);
    

    (重复的代码)
    我们输入一些字符串进去试试,在

        for ( i = 0; i <= 23; ++i )
    

    下断点

    (IDA动态调试内容在此不表)

    输入25个零:

    0000000000000000000000000
    

    image

    查看IDA调试的变量地址:

    image

    根据此地址跟踪到相应位置:

    image

    可以看到按照数字顺序产生的数据,并且我们输入的都是相同的数据,故而猜测逻辑为:
    对输入的数据进行移位变换,然后加上一个迭代变量。

    据此可以进行代码人工识别

    (这里可以多输入一些数据进行试验,笔者实验了A~Za~z,0~9所有字符,都符合这样的假说)

  3. raw代码人工识别:

    #include <stdio.h>
    #include "defs.h"
    
    char raw[] = { 0x68, 0x6F, 0x65, 0x6C, 0x81, 0x69, 0x7A, 0x3D, 0x3B, 0x79, 0x6B, 0x73, 0x38, 0x39, 
    0x7B, 0x70, 0x7B, 0x48, 0x73, 0x7C, 0x85, 0x47, 0x7C, 0x96 };
    int main(int argc, char** argv)
    {
    	for (int i = 0; i < 128; i++)//目的是尝试不同的移位可能,最多有128种。
    	{
    		for (int j = 0; j < 24; j++)//对raw进行更新
    		{
    			printf("%c", (raw[j] - j) - i);
    		}
    		printf("\n");
    	}
    	return 0;
    }
    

image

flag{br41n_f**k_i5_go0d}

posted @ 2021-09-25 21:33  二氢茉莉酮酸甲酯  阅读(243)  评论(0编辑  收藏  举报