https://ctf.j0n9hyun.xyz/challenges
문제를 확인해보니 .ZIP파일을 하나 줍니다.
압축을 풀고 열어보겠습니다.
hex값을 뒤집어 놓았다고 합니다.
사진이 정상적으로 보이는 것을 보니 아마도 숨겨진 사진이 있는데 그 사진의 hex값을 뒤집어 놓은 것 같습니다.
어쨌든 HxD로 열어보겠습니다.
보이는 것처럼 PNG의 헤더가 정상적으로 있는 것을 확인할 수 있습니다.
이제 PNG 파일의 헤더를 검색해서 숨겨진 파일이 있는지 확인해보겠습니다.
처음에 있는 PNG헤더만 검색이 되고 있을 것으로 추정되는 숨겨진 파일의 헤더는 찾아지지 않습니다.
숨겨진 파일의 형식이 PNG가 아닌가 싶어서 JPG도 검색해봤지만 찾을 수 없었습니다.
그러다 깨달았습니다. hex값이 뒤집혀 있다는 것을.
그래서 "50 4E 47"을 뒤집은 "47 4E 50"을 검색해보았습니다.
예상대로 숨겨진 PNG 파일이 있었고 hex값은 뒤집혀 있었습니다.
이제 PNG의 푸터를 뒤집은 "4E 45 49"를 검색해보겠습니다.
숨겨진 파일의 뒤집힌 hex값이 원래 사진의 푸터와 대칭을 이루고 있는 것을 확인할 수 있습니다.
이제 이 hex값을 뒤집으면 플래그를 얻을 수 있습니다.
이제부터 hex값을 뒤집어보겠습니다.
처음에 생각한 방법은 숨겨진 파일의 hex값을 복사한 다음 C언어로 코드를 짜서 뒤집는 것이었습니다.
하지만 hex값이 너무 길어서 코드가 정상적으로 실행되지 않았고, hex값을 4개로 나눠서 hex값을 뒤집었습니다.
이것이 hex값을 뒤집는 코드입니다.
#include<stdio.h>
#include<string.h>
int main()
{
char a[7174] = { "뒤집을 hex값" };
char b[4783] = { "0" };
int i=7171, j=0;
while (1)
{
b[j] = a[i - 1];
b[j + 1] = a[i];
j += 2;
i -= 3;
if (j == 4782)
{
break;
}
}
FILE* fp;
fp = fopen("waytogo1.txt","w");
fwrite(b, strlen(b), 1, fp);
fclose(fp);
return 0;
}
일단 뒤집을 hex값을 저장할 배열 a를 만듭니다.
문자열 배열을 만들 때 중요한 점은 마지막에 NULL이라고 하는 문자열의 끝을 알려주는 문자가 들어갑니다.
따라서 뒤집을 hex값이 7173자라면 배열은 [7174]로 설정해주어야 합니다.
그리고 뒤집은 문자열을 저장할 배열 b를 만듭니다.
b의 크기가 [7174]가 아닌 [4783]인 이유는 HxD에서 hex값을 복사하면 hex값 사이에 공백이 포함되기 때문에
공백을 제외한 글자 수에 NULL의 자리인 1을 더한 값인 [4783]으로 설정해줍니다.
물론 이 값들은 뒤집을 hex값이 7173자일 때의 값이고 글자 수가 달라지면 그에 맞게 바꿔주어야 합니다.
정수형 변수 i와 j를 선언해주는데 이 값들이 배열의 인덱스로 사용할 값입니다.
i가 7171인 이유는 배열 a의 크기인 [7174]는 NULL을 포함하고 있고, 배열의 인덱스는 1이 아닌 0부터 시작하며,
HxD에서 복사한 hex값의 마지막에 공백이 있기 때문에 각각 1씩을 빼준 7171이
실제 hex값이 들어있는 마지막 주소가 됩니다.
이제 본격적으로 hex값을 뒤집습니다.
원래는 for문으로 코드를 짜려고 했지만 배열 2개를 다뤄야 하므로 인덱스로 사용할 변수가 2개기 때문에
for문은 불편해서 while문을 이용했습니다.
hex값을 뒤집을 때 중요한 점은 "50 4E 47"을 뒤집을 때 "74 E4 05"가 아닌 "47 4E 50"으로 뒤집는다는 것입니다.
그 이유는 컴퓨터는 8개의 bit가 모인 1개의 byte를 데이터를 저장하는 최소 단위로 사용하기 때문입니다.
비유를 하자면 우리가 "안녕하세요"를 거꾸로 말할 때 "요세하녕안"로 말하지 "안"을 "ㅇ+ㅏ+ㄴ"으로 분해해서
"ㄴ+ㅏ+ㅇ"처럼 뒤집고 "낭"이라고 말하지는 않는 것과 같다고 보면 되겠습니다.
다시 코드로 돌아가 보면 배열 b의 j(0)인덱스에 배열 a의 i(7171)-1의 값을 넣습니다.
그리고 배열 b의 j(0)+1인덱스에 배열 a의 i(7171)의 값을 넣습니다.
이런 식으로 뒤집는 이유는 위에서도 말했지만 "12 34"를 뒤집는다고 치면 "34 12"가 되어야 하기 때문에
3을 0번째 인덱스로 옮기고 4를 1번째 인덱스로 옮기기 위함입니다.
그리고 j는 2를 더하고 i는 3을 뺍니다.
그 이유는 i는 배열 a의 인덱스로 사용하는 값인데 배열 a에는 공백이 포함되어 있고 그래서 두 개의 글자를 옮기면 공백은 옮기지 않게 하기 위해 3을 더해주는 것입니다.
j는 배열 b의 인덱스로 사용되는 값이고 배열 b는 배열 a에서 hex값만을 받기 때문에 2만 더해주면 됩니다.
이 과정을 반복하다가 if문을 통해서 배열이 가득 차면 break를 이용해서 while문을 탈출합니다.
이제 뒤집힌 hex값이 있는 문자열 배열 b를 .TXT파일로 출력합니다.
이 부분은 따로 설명하지 않겠습니다.
이렇게 뒤집힌 hex값을 얻어낼 수 있고 이 값들을 HxD에 붙여넣고 .PNG파일로 저장하면 됩니다.
파일을 열어보면...
플래그 조차도 뒤집혀있네요.
답:HackCTF{Y0u_tu2n3d_th3_$t@ge_u95ide_d0wn!}
'HackCTF Write Up > Forensics' 카테고리의 다른 글
HackCTF Forensics Terrorist Write Up (0) | 2021.10.03 |
---|---|
HackCTF Forensics Magic PNG Write Up (0) | 2021.10.03 |
HackCTF Forensics 세상에서 잊혀진 날 찾아줘! Write Up (0) | 2021.10.01 |
HackCTF Forensics Secret Document Write Up (0) | 2021.09.30 |
HackCTF Forensics So easy? Write Up (0) | 2021.09.30 |