완료됨
stage2 익스플로잇 코드

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{

    unsigned char byte_40E0[] =
    {
            103,198,105,115,81,255,74,236,41,205,186,171,242,
            251,227,70,124,194,84,248,27,232,231,141,118,90,
            46,99,51,159,201,154,102,50,13,183,49,88,163,90,
            37,93,5,23,88,233,94,212,171,178,205,198,155,180,
            84,17,14,130,116,65,33,61,220,135
    };
    unsigned char byte_4020[] =
    {
            64,  27,  22, 237, 137,  84, 235,  94, 235,  97,
            244, 139, 208, 152, 161, 210,   2, 178, 158, 135,
            141,  45, 190, 123, 230, 243, 169, 178,  95,  32,
            27,  81, 194, 234, 133,  12, 142,  45,  67,   3,
            137, 234, 242,  75, 198,   3,  17,  49,  81,  50,
            25,  41,  64, 226,  19, 206,  54,  20,  19,  33,
            127, 131,   0, 110
    };

    unsigned char byte_4060[] =
    {
            25,  44,  78,  36,  50,  53, 127,  35,  94,  49,
            111,  98,  86,  94,  22, 120,  47,  38,   7,  90,
            80,  33,  72,  67,  45,  10,  97,  25,  23,   4,
            43,  83,  23, 106, 115,  29, 103,  11,   5,  60,
            10,  22, 105,  75,   9,  74,  15,  12,  93, 107,
            48,  41, 126,  24,  10,  72,  68,  54,  88, 116,
            90,  30,  17,  55
    };
    unsigned char key[70] = {0};
    int v0 = time(0LL);
    srand(v0);

    for (int k = 0; k <= 63; k++)
    {
            int v9 = rand();
            for (int j = 33; j <= 127; j++)
            {
                    int v8 = j + byte_40E0[k];
                    char cal  = v8 - (((v9 - 0x800000) & (unsigned int)(v8 * (rand() % 64 + 0x10000))) >> 16);
                    if (cal == byte_4060[k])
                    {
                            key[k] = j;
                            break;
                    }
            }
    }
    printf("%s\n", key);
    return 0;

}

코드를 위와 같이 작성했는데 key를 출력해보면 값이 하나도 안나오네요.. 뭐가 문제일까요

#reversing
작성자 정보
더 깊이 있는 답변이 필요할 때
드림핵 팀과 멘토에게 직접 문의해 보세요!
답변 1

안녕하십니까. 해당 코드를 읽어봤는데 1 byte brute-force를 시도하신 것으로 생각됩니다. 1 byte brute-force를 시도하는 과정에서 문제에 있던 코드를 그대로 복사-붙여넣기를 하신 것 같은데, 그 과정에서 실제 바이너리의 동작과 달라지게 된 것 같습니다.

문의 주신 코드에서 cal 값을 일일이 확인해 봤는데, 실제 바이너리에서 연산되는 결과와는 다른 값이 나옴을 확인하였습니다. 바이너리 내용을 포팅할 때 디컴파일한 코드를 단순 복사-붙여넣기 한다면 자주 실제 동작과 달라집니다. 이에 대한 대안으로, 1 byte brute-force를 디버깅 스크립트 혹은 후킹으로 수행하는 방법이 있습니다. 이 부분을 공부해 보신다면, 위와 같은 오류를 피하실 수 있습니다.

아래는 gdb에서 디버깅 행위를 자동화할 수 있는 gdb-script에 대해 정리해 놓은 블로그 포스트입니다. 해당 포스트에서 1 byte brute-force를 수행하는 방법이 간접적으로 소개되어 있으니 읽어보시면 도움이 되실 겁니다.

gdbscript 사용법

2025.03.12. 17:56