Korea 
Name이 CodeEngn일때 Serial을 구하시오

English 
Find the Serial when the Name is CodeEngn 

 

Dev-C++로 컴파일 된 것은 처음 보는데?? Console 프로그램인 것도 알 수 있다.

 

실행 했더니 위와 같은 결과가… 그럼 Wrong password! 부터 찾아 볼까?

 

문자열 검색을 했더니 Wrong password!가 보였고 저기에 bp를 걸고 이동했다.

그리고 조금 위로 이동했더니 내가 좋아하는 단어인 Good Job! 이 보였고

노란 색 부분과 같이 16.0043C3D8이란 함수가 자주 호출되는 것을 볼 수 있었다. 그 곳이 printf 함수와 같은 기능을 하는 것이라는 것을 짐작할 수 있었다.

 

16.00428A40은 scanf함수라는 것을 짐작할 수 있었다. 그럼 우리는 함수가 끝난 다음부터 분석을 해야겠지.

 

우리가 분석을 해야 할 곳은 위 6줄로 좁혀 진다.

저기서 SS:[EBP-3C]에 우리가 원하는 답이 적혀있다. 근데 이 답은 위의 6줄과 우리가 입력한 값들(NAME, PASS)에 따라 달라지기 때문에 위 6줄을 분석 해야 한다.

앞의 문제와 같이 brute force로 해볼 수 도 있으나 한번 분석해 보자.

MOV EAX, DWORD PTR SS:[EBP-3C] // 이 부분은 scanf에서 입력 받은 값을 EAX에 넣는 것 으로 보인다.

IMUL EDX, EAX, 0ACE80// EDX = EAX * 0ACE80(708224) (오버플로우 발생 확률 높음)

LEA EAX, DWORD PTR SS:[EBP-3C] // EAX = &( SS:[EBP-3C] ), EAX에 변수의 주소를 넣는다.

ADD DWORD PTR DS:[EAX], EDX // *EAX = *EAX + EDX

MOV EAX, DWORD PTR SS:[EBP-40] // EAX에 EBP-40의 주소가 가리키고 있는 값을 넣는다.

CMP EAX, DWORD PTR SS:[EBP-3C] // EAX와 아까 만들었던(*EAX = *EAX + EDX )의 값을 비교한다.

 

위에서 보면 참 간단하다. 우리가 할 일은 A = A + ( A * 708224 )를 구하는 것이다.

한번 해 보자. 일단 A는 123이라고 치면 EAX에 123이 들어가야 하는데 들어 가지 않는다!!

여러 번 실험 결과 저기는 비번에 따라 변하는 것이 아니라 아이디에 따른 다는 것을 알 수 있었다.

그럼 EAX의 값은 항상 고정된다.

그럼 비번은 어딨어!! 라고 했는데 바로 옆에 있었네 -_-;

답은 다 구했으니 입력만 하면 되겄구먼ㅋ

 

Bloger: moltak.net

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

CodeEngn 18  (0) 2010.04.14
CodeEngn 17  (0) 2010.04.14
CodeEngn 15  (0) 2010.04.13
CodeEngn 14  (0) 2010.04.12
CodeEngn 13  (0) 2010.04.12

+ Recent posts