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 |