본문 바로가기
Reversing/드림핵

[Dreamhack] rev-basic-7

by L3m0n S0ju 2021. 3. 30.

 


 

 

문제에서 주어진 파일을 IDA Pro7.5로 실행한다. Correct를 출력하기 위해 check 함수에 들어간다.

 

 


 

입력할 문자열을 input[i], 140003000에 저장된 문자열을 buf[i]라고 가정하면 if문의 조건이 거짓이 되기 위해서 아래와 같은 식이 만족해야한다.

 

i xor rol(input[i] , (i and 7) ) = buf[i]

 

해당 식의 양쪽에 xor i를 해주고 (i and 7) 만큼 ror 해주면 아래와 같은 식이 된다.

 

input[i] = ror(i xor buf[i] , i and 7)

 

더 풀어서 식을 정리하면 아래와 같이 정리할 수 있다.

 

input[i] = ((i xor buf[i]) >> (i and 7)) + ((i xor buf[i]) << ((8-i) and 7))

 

 


 

 

#include <stdio.h>
#include <string.h>

void main()
{
    unsigned char buf[] = { 0x52, 0xDF, 0xB3, 0x60, 0xF1, 0x8B, 0x1C, 0xB5, 0x57, 0xD1, 0x9F, 0x38, 0x4B, 0x29, 0xD9,      0x26, 0x7F, 0xC9, 0xA3, 0xE9, 0x53, 0x18, 0x4F, 0xB8, 0x6A, 0xCB, 0x87, 0x58, 0x5B, 0x39, 0x1E, 0x00};

    unsigned char input[32] = { 0, };
    unsigned char fx[32] = { 0, };
    unsigned char tmp1, tmp2;

    int j = 0;

    for (int i=0; i < 32; i++)
    {
        if (j == 8)
        {
            j -= 8;
        }
        fx[i]=i^ buf[i];
        tmp1 = fx[i] >> j;
        tmp2 = fx[i] << (8 - j);
        input[i] = tmp1 + tmp2;
        printf("%c", input[i]);
        j++;
    }
}

 


위 코드는 input을 출력하는 코드이다. 코드를 실행하면 아래와 같은 결과가 출력된다.

 

 


플래그: Roll_the_left!_Roll_the_right!

'Reversing > 드림핵' 카테고리의 다른 글

[Dreamhack] rev-basic-6  (0) 2021.07.17
[Dreamhack] rev-basic-8  (0) 2021.04.12
[Dreamhack] rev-basic-5  (0) 2021.03.30
[Dreamhack] rev-basic-4  (0) 2021.03.30
[Dreamhack] rev-basic-3  (0) 2021.03.30

댓글