편의상 ButtonListner라는 레이블을 붙여보자. 주요 내용을 훑어보자. 함수 프롤로그는 대충 보고 GetDigItemTextA라는 함수를 호출하는 것이 보인다. 텍스트박스의 텍스트를 가져오는 함수인 것 같다. https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getdlgitemtexta#parameters 대화 상자의 핸들러, 컨트롤러의 아이디?, 문자열을 입력받을 버퍼 위치, 버퍼의 크기 순 인자인것 같다. 스택에 들어가는 순으로 보면 eax가 가장 마지막 인자이고, 인자가 총 3개 들어가는 것을 보니 getDigItemTextA의 상위 함수 중 문자열 길이를 받지 않는 3개의 인자를 받는 함수를 사용한 듯 싶고, eax에 들어가는 주소가 문자열을 받아 저장하는 버퍼의 주소인 듯 싶다. 함수를 호출 후 eax에 들어있는 주소를 덤프 창에서 한번 확인 해 보자. 0019F6F4엔 아무것도 없다. 함수를 호출하고 나면, 메모리에 입력했던 123이 들어간 것을 볼 수 있고, 함수의 리턴값을 받아온 eax가 3의 값을 가지는 것을 볼 수 있다. 3은 문자열 길이로 추정된다. 여길 다시 보면, 함수를 호출하고 나와서 스택을 정리하지 않고 바로 실행문이 나오고, 이미 정리된 스택의 위치를 가리키는 esp스택의 4바이트 뒤에 다시 저장된 문자열의 주소가 나온다. 함수를 호출하고 난 뒤의 바로 다음 실행문은 비교를 위한 cmp문이다. esp + 5는 문자는 4바이트 뒤부터 시작하는 문자열의 2번째 문자로서 123에서 2를 가리키고 있다. '2'와 'a'를 비교하고 있다. jne 401135인데, 같지 않으면 점프한다. 점프된 곳을 따라가보자. Incorrect Password를 인자로 넣은 메시지 박스를 띄우고 리턴한다. 이 주소가 password를 검사하는 루틴에서 틀렸을 때 점...
댓글
댓글 쓰기