본문 바로가기
Security/Reversing.kr

[Reversing.kr] ImagePrc

by PhoB 2023. 6. 23.

문제

이렇게 낙서가 가능한 조그마한 창이 나온다. Check를 누르면

Wrong이라고 나오면서 종료가 된다.

그렇다면 Wrong이 나오지 않는 그림을 찾아야하는것 같다. 근데 비트단위일텐데 그게 가능할까...? 일단 해보자

시작

x32 dbg를 이용해서 실행시켜보면 일단 EntryPoint는 현재 이 부분이다.

이제 아까 발견했던 Wrong를 찾기위해 문자열 참조를 해보자

맨 밑에 발견!

디버깅을 해보면서 주석을 좀 써놨는데 &MessageBoxA를 통해서 Wrong메세지 박스를 띄우므로 이전에 정답을 검사하는 부분이 있을것이라고 생각하였다.

때문에 위로 올려보면

GetDIBits라는 함수가 실행되는것이 보인다.

이 함수가 무었인지 하니..

마이크로소프트 공식문서 참조

얾.... 대충 해석해보면 

지정된 호환 비트맵의 비트를 검색하고 지정된 형식을 사용하여 DIB로 버퍼에 복사합니다

라고한다. 내가 그린 낙서의 비트를 추출해서 버퍼에 복사하는것 같다.

그리고 이후 두개의 함수를 사용해서 비교대상 비트맵을 가져온다. 

계속 디버깅을 해보면 알겠지만 해당 프로그램에는 제대로 그림(?)을 그렸다고 하더라도 정답 메세지를 띄워주는것은 아니다. 그렇다면 이 비교대상 파일 자체가 FLAG일 것이다.

그렇다면 결국 비교대상 이미지를 얻어내는게 해당 문제의 최종 목표일 것이다.

문제를 다운받았을때 같이 딸려오는 이미지 파일이 없었기때문에 파일은 내장되어있을 것이다 PEView로 살펴보자

rsrc섹션에 이미지가 들어있다. 여기서 IMAGE_RESOURCE_DATA_ENTRY를 보면 

시작주소가 0007E060이고 사이즈가 15F90이라는것을 알 수 있다.

`

이미지 파일을 보면 0007E060부터 시작해서 쭉 내리다보면 대부분 FF로 가득차 있지만 중간중간 00도 보인다.

해당 비트맵파일을 보기 위해서는 우선 빈 이미지 파일을 만들어주고 거기에다 덮어씌우면 될것이다.

그렇게 하기 위해서는 우선 원본 이미지와 동일한 가로,세로를 가지는 프레임을 먼저 만들어줘야한다.

다시 마이크로소프트 공식문서로 돌아가서 확인해보면 LPBITMAPINFO라는 구조체에 해당 정보가 들어있다.

정확하게는 헤더에 들어있다.

이제 원하는 값을 알아내기 위해 중단점을 잡고 실행을 해 보면

총 7번의 push가 일어나 7개의 인자가 들어간다 위에서 설명한 GetDIBits의 인자 7개가 들어간 것이다. 그렇다면 우리가 필요한것이 6번째이므로 6번째로 들어간인자를 까봐야한다.(이건 아래에서 위로 세야한다 push ecx가 1번째 , push eax가 2번째.. 이런순서로) 그러므로 덤프에서 edx를 따라가보면

이렇게 나온다.

그렇다면 위에 tagBITMAPINFOHEADER의 인자들을 보면 순서대로 size , width , height , planes , bitcount....이렇게 나온다. 각각 DWORD(4byte) , LONG(4byte) , WORD(2byte)이므로 읽어보면

size : 0x28

width : 0xC8

height : 0x96

planes : 0x01

bitcount : 0x18

이렇게 된다 우리가 필요한건 높이와 너비 그리고 파일 저장 형식을 지정해주기위해 bitcount까지 필요하다

그러면 다시

width : 0xC8(DEC : 200)

height : 0x96(DEC : 150)

bitcount : 0x18(DEC : 24)

이제 그림판으로 가로 200에 세로 150픽셀짜리 24비트 비트맵 파일을 만들어주자 확장자는 .bmp이다

그림파일을 만들어준뒤 문제파일을 이번에는 HxD로 실행시켜준 뒤 이제 여기서 이미지 파일인 부분을 추출해내야한다. 아까 시작주소가 0007E060부터 시작했는데 PEview에서 상단의 View - Address - File offset을 클릭해주면 00009060부터 시작하는것을 확인할 수 있다. (HxD의  Offset은 File Offset을 나타낸다 , 0007E060 RVA로 상대 가상 주소이다)

시작위치부터 이미지 파일 크기(15F90)만큼을 추출해주자 (Ctrl + E)

수락후 선택된 영역을 복사해주자(Ctrl + C). 이후 아까 만들어둔 빈 bmp파일을 다시 HxD에서 열어보면

36부터 이미지가 시작되고있는것을 알 수 있다. 그러면 36부터 15F90만큼의 영역에 덮어씌워주자

딱 맞게 선택된 모습

해당 영역이 선택된 상태로 붙여넣기를 해주고 저장해주면 빈 이미지 파일이 변화하면서 FLAG가 나온다!

블러처리했습니당

 

'Security > Reversing.kr' 카테고리의 다른 글

[Reversing.kr] Music Player  (0) 2023.06.24
[Reversing.kr] Replace  (0) 2023.06.22
[Reversing.kr] Easy Keygen  (0) 2023.06.07
[Reversing.kr] Easy Crack  (0) 2023.06.06