abex crackme2를 풀어내는 방법중에
분기문이 있는 곳에 점프문을 수정해서 풀어 보았다.
다른 방법으로도 풀어내 보자.
틀렸을 때 나오는 메시지의 문자열을 바꾸는 방법
문자열 패치
문자열 수정하기도 귀찮아서 맞았을 때 나오는 문자열의 주소를 넣게 하였다.
그 다음 방법은 정석적인 이름에 따른 시리얼 값이 있는 주소에서 시리얼 값을 알아와서 맞게 입력해서 패치 없이 진행하기
테스트는 아래와 같이 하였다.
분기문이 있는 곳 위에 함수가 있는데 아마 이 함수에서 비교를 하는 것 같다.
함수 안에 들어갔을 때 local.17과 local.13의 주솟값을 매개변수로 넣은 arg.2와 arg.1의 주솟값을 또 push 하고 있는데 그 스택에 있는 주소를 아래 hex 덤프 창에서 보니
0019f18c 와 0019f19c로 서로 16바이트 차이나는 위치를 가지고 있으며
둘의 차이점은 빨간 네모를 친 곳밖에 차이가 나지 않는다.
책에서 본 것처럼 저것이 실제 문자열의 주소를 가리키게 하는 거라면 리틀 엔디언으로 표기된 주소를 다시 원래대로 바꾸고 주소를 따라가 보았다.
주소를 따라가 보니 9 5 9 6 9 7 9 8 이라는 문자가 나오고,
다음 주소를 따라가 보니 임시로 넣었던 시리얼 값인 a b c d가 나온다.
그럼 두 주소는 비교될 시리얼 값과 내가 넣은 시리얼 값일 것이다.
9 5 9 6 9 7 9 8 은 무엇을 의미하는 것인가.
아스키코드로도 95 96 97 98은 내가 넣은 시리얼 값과는 관련이 없다.
그럼 abcd와 95969798이라는 문자열을 그대로 비교한다는 것이니까
이름에 1234를 넣었을 때 시리얼 값은 95969798이라는 것을 알 수 있다.
다시 실행시켜 시리얼에 95969798을 넣었을 때 성공했다.
분기문이 있는 곳에 점프문을 수정해서 풀어 보았다.
다른 방법으로도 풀어내 보자.
틀렸을 때 나오는 메시지의 문자열을 바꾸는 방법
문자열 패치
문자열 수정하기도 귀찮아서 맞았을 때 나오는 문자열의 주소를 넣게 하였다.
그 다음 방법은 정석적인 이름에 따른 시리얼 값이 있는 주소에서 시리얼 값을 알아와서 맞게 입력해서 패치 없이 진행하기
테스트는 아래와 같이 하였다.
분기문이 있는 곳 위에 함수가 있는데 아마 이 함수에서 비교를 하는 것 같다.
함수 안에 들어갔을 때 local.17과 local.13의 주솟값을 매개변수로 넣은 arg.2와 arg.1의 주솟값을 또 push 하고 있는데 그 스택에 있는 주소를 아래 hex 덤프 창에서 보니
0019f18c 와 0019f19c로 서로 16바이트 차이나는 위치를 가지고 있으며
둘의 차이점은 빨간 네모를 친 곳밖에 차이가 나지 않는다.
책에서 본 것처럼 저것이 실제 문자열의 주소를 가리키게 하는 거라면 리틀 엔디언으로 표기된 주소를 다시 원래대로 바꾸고 주소를 따라가 보았다.
주소를 따라가 보니 9 5 9 6 9 7 9 8 이라는 문자가 나오고,
다음 주소를 따라가 보니 임시로 넣었던 시리얼 값인 a b c d가 나온다.
그럼 두 주소는 비교될 시리얼 값과 내가 넣은 시리얼 값일 것이다.
9 5 9 6 9 7 9 8 은 무엇을 의미하는 것인가.
아스키코드로도 95 96 97 98은 내가 넣은 시리얼 값과는 관련이 없다.
그럼 abcd와 95969798이라는 문자열을 그대로 비교한다는 것이니까
이름에 1234를 넣었을 때 시리얼 값은 95969798이라는 것을 알 수 있다.
다시 실행시켜 시리얼에 95969798을 넣었을 때 성공했다.
'리버스 엔지니어링' 카테고리의 다른 글
리버싱 연습 - abex crackme5 시리얼 타파 (0) | 2020.06.30 |
---|---|
리버싱 연습 - abex crackme2 (3) 시리얼 핵심 루틴 (0) | 2020.06.30 |
리버싱 연습 - abex crackme 2 (1) (0) | 2020.06.30 |
리버싱 공부 - 스택 프레임 기법 (0) | 2020.06.30 |
리버싱 공부 - 레지스터 (0) | 2020.06.30 |