[주의] 해당 글에는 풀이 및 정답이 적혀있습니다.
스스로 해결하고 싶으신 분들은 문제를 해결한 후, 이 페이지를 참고하셨으면 합니다 : )
프로그램을 실행해보면 무언가를 그릴 수 있는 화면과 Check 버튼이 나온다. Check 버튼을 눌러보면 Wrong 메시지 박스가 호출된다. 디버깅해보도록 하자.
일단 Wrong 문자열이 출력되는 메시지박스 구문부터 찾았다. 근데, 특이한 점은 틀렸다고 알려주는 부분은 있는데 정답일 때 맞았다고 해주는 부분을 찾지 못했다.
계속 분석해보면 GetDIBits 함수를 호출한다. 검색해보니 지정된 호환 비트맵에서 비트열을 뽑아내서 지정된 포맷을 사용하는 DIB로 버퍼에 복사한다고 한다. 아마 그린 이미지를 비트맵으로 읽어서 비트열을 뽑아내서 메모리 어딘가에 저장하는 것 같다.
그 다음에는 비교 구문이 있는데 이 부분에서 Wrong 메시지 박스를 호출한다. 일단 처음에 EDI를 0으로 셋팅하고 EDI가 0x15F90이 될때까지 1씩 증가시키면서 무언가를 비교한다. 무엇을 비교하나 살펴보면 [ECX]에서 가져온 DL과 [EAX+ECX]에서 가져온 BL을 비교한다. 만약, 다르다면 Wrong 메시지 박스 호출 구문으로 점프한다.
어떤 값을 비교하나 살펴보면 [ECX]에는 내가 그린 비트맵 정보가 들어가는 듯 했다. (아무것도 그리지 않으면 전부 0xFF로 채워졌다.) [ECX+EAX]에는 비교하는 비트맵 정보가 들어있는 듯 했다. 처음에는 많은 고민을 했다. [ECX]와 [ECX+EAX]를 비교하지 않고, [ECX+EAX]를 [ECX]로 패치하면 비교문을 패스할 수 있다. 하지만 Flag를 출력해주거나 하지 않았다. 따라서 [ECX+EAX]에 들어있는 비트맵 정보가 정답을 알려주는 거라고 생각했다. (이 부분을 생각하는데 오래 걸렸다.)
[ECX+EAX]에 있는 데이터를 복사하고 그림판으로 BMP 파일을 하나 만들었다. 비트맵에도 여러 종류가 있었는데 저장한 데이터가 많아서 데이터가 많은 걸로 골라서 HxD를 이용해서 저장하니깐 정답 이미지 파일이 나왔다.
'Security' 카테고리의 다른 글
ALLES! CTF 2021 writeup (0) | 2021.09.10 |
---|---|
KakaoTalk Hooking (0) | 2021.05.22 |
[Reversing.kr] Replace (0) | 2021.04.01 |
[Reversing.kr] Easy Unpack (0) | 2021.03.28 |
[Dice CTF 2021] flippidy (0) | 2021.03.01 |