[Reversing.kr] ImagePrc

프로그램은 심플하네요. Check를 눌러보면 Wrong! 이라고 뜹니다. 어셈블리 코드를 확인해보겠습니다.

EDI는 40139D번지에서 0으로 초기화되고, 루프를 돌 때 마다 1씩 증가해서, 매 루프가 끝날 때 마다 15F90(=90000)와 비교해 작으면 루프를 계속 돕니다. 그리고 [ECX], [EAX+ECX]가 다를 때 루프를 즉시 탈출해 Wrong을 출력합니다. 

맨 처음 루프에 들어갈 때 ECX는 4950048이고 EAX+ECX는 47E060입니다. 즉 4950048번지, 49E060번지부터 90000바이트동안 적힌 값이 일치하는지를 비교합니다. 그러면 두 주소에 적힌 값이 무엇인지만 알아내면 얼추 실마리를 다 잡아낼 수 있을 것 같습니다. 49E060번지의 값은 그냥 헥스 에디터로 파일을 확인하면 쉽게 알 수 있는데 4950048번지를 갑자기 왜 보고자 하는지 조금 뜬금없네요. 이 부분을 위해서는 위에 있는 GetDIBits 함수를 살펴봐야합니다. GetDIBits 함수는 bitmap 이미지의 data를 buffer에 저장해주는 함수입니다.(https://msdn.microsoft.com/ko-kr/library/windows/desktop/dd144879(v=vs.85).aspx

3번째로 PUSH되는 주소에 data를 씁니다.

음.. 그런데 Buffer가 NULL입니다. 그러면 Bitmapinfo에 쓴다는 것 같네요. 조금 오리무중이지만 일단 401508번지 함수 안으로 들어가봅시다.

주구장창 가다가 HeapAlloc을 만났습니다. 크기도 15F90인것이 뭔가 그럴싸하네요. 계속 가봅시다. 

핵심은 이부분이었네요. FIndResourceA, LoadResource, LockResource를 차례로 실행하고 ESI 주소를 확인해보면 나중에 image를 비교하는 곳의 주소를 제대로 가리키고 있습니다. 그러면 프로그램에서 뒤 90000바이트를 떼내어 그림파일을 만들면 될거고, 아까 GetDIBits에서 nLines = 150이니까 높이가 150, 넓이는 200이라고 추정이 가능합니다.(각 점이 3바이트씩 쓰니까.)

150*200 짜리 빈 bmp 파일을 만들고 붙여보면

정답을 알 수 있습니다.




'워게임 > Reversing.kr' 카테고리의 다른 글

[Reversing.kr] Ransomware  (0) 2017.12.31
[Reversing.kr] Direct3D FPS  (0) 2017.12.30
[Reversing.kr] Position  (0) 2017.12.30
[Reversing.kr] Replace  (0) 2017.12.29
[Reversing.kr] Music Player  (0) 2017.12.29
[Reversing.kr] Easy Unpack  (0) 2017.12.29
  Comments