티스토리 뷰

level16번 문제는 14,15번과 유형이 유사합니다. CodeEngn이 name일 때 Serial을 구하는 겁니다. BP를 이용해서 풀 수도 있지만 하나하나 상태를 확인하면서 하는게 좋습니다. BP를 이용하면 1분안에 해결할 수 있는 유형의 문제입니다.


실행을 하면 창이 하나 뜨고 name과 pw를 입력받습니다. 



Exeinfo PE 실행을 했더니, C++로 작성이 되어있습니다.



OEP 화면입니다. OEP는 00401220 이네요.



문자열이 들어있는 루틴으로 들어가서 BP를 찍어서 시작하겠습니다.




아래 부분은 재미있게 잘 만들었네요. 화면 크기를 조작하고, 캡션과, 문자열을 출력하는 구문입니다. 0043C3D8 함수는 출력을 담당하는 함수입니다.




0043D758함수는 NAME을 입력받는 함수입니다. 문제대로 CodeEngn을 입력 하겠습니다.




아래 사진의 00412430 함수로 들어가서 보겠습니다.




00412430 함수 안에는 간단한데, 00412437, 00412439 줄에는 각각 CodeEngn(입력 값)의 이름과 사이즈를 순서대로 EAX에 넣어줍니다. 결국 size를 EAX에 넣고 리턴합니다. 




리턴 값은 8이 되었습니다. 




0040152D줄은 EAX(NAME의 size)와 EBP-20에 있는 0022FF58안에 있는 값과 비교합니다. 하지만 0과 8을 비교하는 것이기 때문에 틀립니다. 결국 점프를 안하고 아래로 넘어갑니다.

 




아래 루틴에서 00401532줄을 보면 EAX에 EBP-38의 값을 넣습니다.00401538 줄의 00412430함수는 name의 길이를 얻어옵니다. 얻어온 값을 EAX에 넣고 그 값을 0040153D 줄에서 EBP-20에 8을 넣습니다. 결국 40152D 줄에서 CMP로 비교를 통해서 값이 다른 것을 여기서 다시 넣어준 것입니다.00401540 줄로 다시 돌아와서 EDX에 8을 집어 넣습니다.




아래 화면을 보기로 잡고 하나하나 트레이싱 한 값을 적어 보겠습니다.



00401540을 실행한 화면입니다. EDX에 8을 집어넣습니다. 


00401543을 실행한 화면입니다. EAX에 EDX를 집어 넣는데, 이미 8이 있기 때문에 아무 변화가 없습니다.

 


00401545를 실행한 화면입니다. EAX와 EAX를 더하기 때문에 8+8을 합니다. 10진수로는 16이지만 16진수로는 10입니다.


00401547을 실행한 화면입니다. EAX와 EDX를 더합니다. EAX에는 10 + 8 = 18이 됩니다.


00401549를 실행한 화면입니다. SHL EAX,2를 통해서 EAX를 왼쪽으로 2만큼 쉬프트 해서 60을 만듭니다.


40154C 줄에서는 EAX(60)을 EBP-3C(0022FF3C)에 넣습니다. 넣은 결과 22FF3C에는 60이 저장됩니다.

   


밑의 세 줄을 실행하겠습니다.


00401552 줄을 실행한 결과입니다. IMUL을 통해서 EAX(60)과 EBP-3C에 있는 값을 곱합니다. EAX는 2400이 됩니다.

   


00401556 줄을 실행한 결과입니다. 위와 같이 다시 똑같은 방식으로 곱하면 EAX는 000D8000이 됩니다.


0040155A 줄은 EAX에 17을 더합니다. 000D8017이 됩니다.



40155D 줄을 보면 EAX에 있는 000D8017의 값을 EBP-3C에 집어 넣습니다. 

 



아래 그림의 3줄을 실행 하겠습니다.



0040158E 줄을 실행한 결과 EAX에 0040155D줄에서 실행해서 0022FF3C에 넣어준 17 80 0D 00 (000D8017)을 EAX에 저장합니다.



여기가 중요한 곳입니다. IMUL을 통해서 EDX(0)와 EAX(000D8017)와 '0ACE80'을 곱해서 EDX에 넣어줍니다. EDX에는 E4B88D80 이 들어갑니다.



00401597을 실행하면 EBP-3C에 있는 주소를 EAX로 LEA를 통해 주소 값만 저장합니다.



얼마 남지 않았네요. 아래의 줄을 보겠습니다.



40159A를 실행하면 EAX(0022FF3C)안에 있는 값(왼쪽 그림(000D8017))과 EDX(E4B88D80)를 더하면 오른쪽 그림에서 보이듯이 E4C60D97 값이 나옵니다. 

 



40159C 줄은 EBP-40에 있는 'C'값을 EAX에 저장합니다. C는 10진수로 '12'입니다. 임의로 패스워드를 12로 넣었기 때문에 C로 받습니다.

 



0040159F 줄에서 CMP로 EAX에 있는 'C'와 EBP-3C에 들어있는 'E4C60D97'을 비교 합니다. 결국 임의로 넣었던 패스워드와 RealPW를 비교하는 줄이네요. 0040159F 부분에 BP만 걸어도 쉽게 풀수 있는 문제였습니다. 너무 멀리 왔다고 생각 하겠지만 하나하나 스택창과 레지스터 창을 보며 비교해가는 것도 재미가 있습니다. 


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

[codeEngn] Basic RCE level18  (0) 2015.07.30
[codeEngn] Basic RCE level17  (2) 2015.07.30
[codeEngn] Basic RCE level15  (0) 2015.07.29
[codeEngn] Basic RCE level14  (0) 2015.07.29
[codeEngn] Basic RCE level13  (0) 2015.07.29
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함