문제에서 주어진 파일을 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 |
댓글