LineCTF 2022 Rolling

14371 ワード

これは一つの問題を解いた.
もう少しTrustCodeを差し込めばいいと思いました眠いです.
アプリをスマホでダウンロードし、開いてボタンを押すと終了してしまい、何か問題があると思います.
まずは本館を開くと.

ここからはチェックごとに1バイトが表示されます.(確かに推測です)
しかし、そのコードサイクル中にfridaを注射することは不可能です.
インストールされていないarm 64携帯電話のため...したがって、別の方法でライブラリを動的に使用して、低コードを再実装します.
#include <stdio.h>
#include <dlfcn.h>
#include <stdlib.h>
int main()
{
        void* handle = dlopen("/data/data/com.termux/files/home/rolling/libnative-lib.so",RTLD_NOW );
        if(!handle)
        {
                puts("dlopen error");
                exit(0);
        }
        printf("pid : %d\n", getpid());
        puts("dlopen success");
        printf("handle addr : %p\n", handle);
        int len = 0;
        unsigned int* (*meatbox)(char*) = dlsym(handle, "_Z7meatboxPc");
        unsigned int* (*soulbox)(char*) = dlsym(handle, "_Z7soulboxPc");
        unsigned int* (*godbox)(char*) = dlsym(handle, "_Z6godboxPc");
        char* asc_box = (size_t)meatbox + (0x30e0);
        printf("meatbox addr : %p\n",meatbox);
        printf("soulbox addr : %p\n",soulbox);
        printf("godbox addr : %p\n",godbox);
        printf("asc_box addr : %p\n",asc_box);
        char flag[0x100] = {0};
        char* ch = flag;
        int idx = 0;
        int while_flag = 1;
        while(while_flag)
        {
                //brute force
                for(int i = 0x20; i<=0x7f; i++)
                {
                        *ch = i;
                        unsigned int* res_meatbox = meatbox(ch);
                        unsigned int* res_soulbox = soulbox(ch);
                        unsigned int* res_godbox = godbox(ch);
                        //printf("%p\n", asc_box+4*idx);
                        if(*((unsigned int*)(asc_box+4*idx)) == *res_meatbox)
                        {
                                if(*((unsigned int*)&asc_box[4*(idx+1)]) == *res_soulbox)
                                {
                                        if(*((unsigned int*)&asc_box[4*(idx+2)]) == *res_godbox)
                                        {
                                                printf("%c",i);
                                                if(i == '}')
                                                        while_flag = 0;
                                                break;
                                        }
                                }

                        }
                }
                ch++;
                idx += 3;
        }


}
ライブラリパスを調整しarm 64システムに戻るだけです.
idaの肉類は実際にはunsigned int 8であることに注意してください.

DWORDを用いて比較した.