티스토리 뷰

level12번의 문제를 보면 key값과 메시지 박스의 성공 내용부분을 key값으로 덮어씌우고 그 영역을 답으로 제출하라는 내용입니다.

실행을 해보니 키값을 받습니다.

GetDlgItemInt() API 함수에 BP를 걸고 임의 숫자 1234를 입력하겠습니다.


GetDlgItemInt()반환 값을 레지스터로 보면 EAX에 4D2(123)이 반환이 되었습니다.


그 밑에 한 개의 루틴이 있습니다. 문제와는 상관은 없지만 분석을 진행을 하겠습니다. 일단 00401063줄에서 ESI에 00403000에 있는 값들을 이동합니다.


ESI에는 403000에 있는 문자열들이 많이 있습니다.


Hex dump로 보니, 문자는 아닌 것 같고, 그냥 패스워드를 이 중에 찾는 건가? 라는 생각이 들었습니다.


그 밑의 소스에서는 CMP로 ESI안의 문자열 4바이트와 0을 비교합니다. 이 말은 즉, 문자열이 존재하지 않을 때까지 비교하겠다는 소리입니다.


바로 이부분, 00 00 00 00이 처음으로 나오는 부분입니다. 저 부분에서 루틴이 끝마쳐집니다.


루틴안의 함수부분인데, ESI에서 4바이트를 가져온 값을 EBX에 넣고 40110F 함수를 실행합니다. 


EBX에는 Hex dump에서 봤던 첫 4바이트 '4F 71 69 71'이 빅엔디안으로 바뀌어서 저장이 됩니다. 4바이트씩 이런식으로 저장을하고 어떤 작업을 하는 것을 예상할 수가 있습니다.


0040110F 함수 안의 루틴인데, 제가 입력했던 '123'과 문자열에서 불러온 '7169714F'를 가지고 무슨 작업을 합니다. INC로 1을 올리고 NOT로 값을 변형 시키고 AND로 값을 다시 변형 시킨 후에 결국 EAX에 변형된 값을 리턴 합니다.


결과 값을 보면 7169714F -> 7169759D 로 바뀌었습니다.


이 부분은 0이 아니기 때문에 ESI에 0이 나올때 까지 [ADD ESI, 4] 를 이용해서 값을 다른 4바이트로 이동하고 다시 0과 비교하는 루틴으로 올라갑니다.


ESI에는 4가 더해진 화면입니다.


4F 71 69 71 -> 62 34 45 68 으로 변경이 되면서 '0'을 만날 때까지 위와 같은 루틴을 돌 것입니다.


0040107B 부분 밑에 BP를 걸어서 실행을 하면 '0'을 만나서 0040107D 부분으로 갈 것입니다. 여기가 바로 중요 부분인데, CMP를 이용해서 시리얼 값과 아까 임의로 입력한 '1234'를 비교합니다. 맞으면 성공을 합니다.


7A2896BF를 그냥 입력을 하면 안 되고 10진수로 변환해서 입력을 하면 시리얼 값을 구할 수가 있습니다.


이제 성공할 때 문자열이 있는 곳을 Hexray를 이용해서 성공 문자열을 키값으로 변형하고 그 영역을 답으로 적으면 됩니다. 그런데 주의할 것이 있는데, 널값을 생각못하고 계속 삽질 했었습니다. 널값을 포함시키고 입력을 해야합니다. 아래의 그림은 성공 문자열을 키 값으로 변형을 시킨 모습입니다.



'Wargame > codeengn' 카테고리의 다른 글

[codeEngn] Basic RCE level14  (0) 2015.07.29
[codeEngn] Basic RCE level13  (0) 2015.07.29
[codeEngn] Basic RCE level11  (0) 2015.07.29
[codeEngn] Basic RCE level10  (0) 2015.07.29
[codeEngn] Basic RCE level09  (0) 2015.07.28
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함