달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

'imageprc'에 해당되는 글 1

  1. 2017.07.07 [문제풀이] reversing.kr - ImagePrc

이번 문제도 역시 아무런 힌트가 없었다.


문제를 실행시켜서 버튼을 눌러보니 아래와 같이 동작했따.



그래서 올리디버거를 켜서 분석을 진행했다.

가장 만만한 문자열 검색을 시작했고 어렵지 않게 발견할 수 있었다.

위 메시지 뿐만 아니라 조건문도 쉽게 발견할 수 있었다.



간단히 설명하면 비트맵의 래스터 데이터를 메모리로 불러와서 리소스 섹션에 있는 값이랑 비교하여 동일할 경우 승리하는 ... 뭐 그런 문제다.


이 문제 역시 처음엔 멍청한 짓을 하며 시간을 보냈다.

메모리로 복사해 온 데이터란 걸 인지하기 전에 조건문을 만족시키기 급급하여 인라인 패칭을 하여 리소스 섹션에 있는 값을 메모리로 다 복사했었다. 이렇게 하면 화면에 보이는 비트맵에 정답이 보일 줄 알았다.


이같은 짓을 몇 번이나 해본 뒤 내가 얼마나 바보같은 짓을 시도했는지 깨닫게 되었다.


그래서 변경한 방법은 리소스 섹션에 존재하는 내용을 복사하여 그림판으로 열어보는 것이었다. 그래서 API 정보를 확인하고 관련 정보를 수집했다.



GetDIBits 함수에서 사용하는 BITMAPINFOHEADER 구조체를 활용하여 관련 정보를 수집할 수 있다. 


출처 : https://msdn.microsoft.com/en-us/library/windows/desktop/dd183376(v=vs.85).aspx


이 문제에서 신경써야하는 변수명은 biWidth, biHeight, biBitCount, biSizeImage 정도이다.

이는 순서대로 넓이, 높이, 적용된 비트수, 이미지 크기를 나타낸다.




따라서 리소스 섹션의 래스터 데이터 영역을 바이너리로 복사한 뒤 그림판으로 위 구조체가 가리키는 정보대로 생성한 다음에 비트맵 데이터 영역에  덮어써주면 답이 나온다.



처음에 위와 같은 생각을 하고 그림판에 저장을 했는데 아래와 같은 그림이 나와서 내 접근법이 잘못된 줄 알았다(한 곳에 글자가 뭉쳐저서 이상한 그림처럼 나옴).




답을 알고보니 저렇게 뭉쳐서 나와도 답처럼 보이네.. 그래서 모자이크 ...ㅋ


어째든 시간만 엄청 잡아먹고 성취감도 떨어지는 문제였다.

그러나 뭐 누굴 탓하나.. 미숙한 내 잘못이지 제길!!ㅋ


:
Posted by einai