분석 툴 : Immunity Debugger
먼저 exe 파일을 실행해보니 비밀번호를 입력해야 하는 것 같다.
hello 를 입력해보았다.
[Search for] - [All referenced text strings] 를 이용해 이 프로그램의 모든 스트링을 확인해본다.
정답일 때 나오는 듯한 문자열 "Congratulation !!"이 눈에 띄므로 더블클릭하여 해당 위치로 간다.
해당 함수의 시작점으로 가 bp를 걸고 한 줄씩 실행하며 어셈블리어를 쓰윽 분석해본다.
보통 CMP 구문에서 비교한 후, JNZ 구문을 실행할 지 말지를 결정하는 경우가 많다.
CMP A B | 비교 구문. A와 B가 같은지 판단 (같을 경우 ZE는 1이 되고 다를 경우 ZE는 0이 된다.) |
JNZ(Zump if not Zero) Address | 연산 결과가 0이 아니면(ZF=0)이동하고, 0이면 (ZE=1) 다음 명령을 실행 |
CMP 구문에서 [ESP+5] 자리의 값과 61을 비교하고 있다.
ESP+5 자리를 가보니 내가 입력한 hello 중에 e 가 자리잡고 있는 것을 확인할 수 있다.
즉, 내가 입력한 문자열의 두번째 자리와 61을 비교하여
두 문자가 같을 경우 ZF가 1이 되고, 나머지 경우에는 ZF가 0이 되어
00401135 주소로 갈지(ZF=0) 말지(ZF=1)를 결정한다는 것이다.
JNZ문이 실행되면 함수가 종료되어 "Incorrect Password"가 뜨므로 JNZ문이 실행되면 안된다.
61을 아스키 값으로 변경하면 a 이다.
따라서 비밀번호의 두번째 자리가 a라는 것을 알게된 셈이다.
이번엔 입력에 hallo 를 입력한 후 실행해본다.
JNZ 구문이 실행되지 않고 (ZF=1 이므로)
밑의 명령어로 넘어온다.
LEA ECX, ~~[ESP+A] = "ECX에 ESP+A 값을 옮긴다"
ECX 값을 확인해보니
내가 입력했던 세번째 문자열부터 끝까지의 문자열("llo")이 담겨져 있다.
이후 CALL 함수를 실행하면 ZF가 0이 되어
JNZ 구문에 걸린다.
따라서 ■■a5y■■■ 임을 예상한다.
이제 ha5yllo를 입력한 후 실행을 해보았다.
0040606C 값("R3versing")을 ESI로 옮긴 후,
ESP+10을 EAX에 옮기고 있다.
[ESP+10] 의 값을 확인하니 내가 입력했던 다섯번째 이후의 문자열("llo")이 보인다.
그리고 반복문이 나오는데,
반복문을 살펴보니
EAX 값과 ESI 값을 각각 DL, BL 레지스터에 넣고
그 둘을 CMP 구문으로 비교하고 있다.
즉, llo 와 R3versing을 비교하고 있는 것.
따라서 ■■a5yR3versing 임을 예상한다.
다시 ha5yR3versing을 입력한 후
반복문까지 거친 후
CMP 구문을 또 만났다.
[ESP+4] 값과 45를 비교한다.
[ESP+4]에는 내가 입력했던 첫번째 문자열("h")가 있다.
45는 아스키 값으로 "E"이므로
최종 비밀번호를 유추할 수 있게되었다.
'Study > Reversing' 카테고리의 다른 글
CodeEngn Challenge : Basic RCE L16 (0) | 2021.03.30 |
---|---|
CodeEngn Challenge : Basic RCE L15 (0) | 2021.03.30 |
main 함수 찾기 (0) | 2021.03.23 |
OllyDBG, 어셈블리어 (0) | 2021.02.04 |
IAT & EAT (0) | 2021.01.25 |