안 쓰던 블로그
리버싱-분기문 우회 본문
.exe파일을 실행하면 patch me라는 메모장이 뜨는데, 이걸 well done으로 바꾸라는 문제
메모장에 문자열이 있어서 참조할 게 없으니까 그냥 쭉 실행을 해 본다
중간에 걸리면서 메모장이 뜬다
근데 여기가 cmp의 결과를 jne해서 넘어오는 작업을 하고 있다 (브레이크 포인트 부분)
정리하면 위에서 어떤 계산의 결과값으로 cmp를 비교한 후
맞으면 f.txt를 열고, 아니면 s.txt를 여는 프로그램이었다
(그리고 문자열에 들어있는 경로에 들어가면 그 파일이 실제로 있더라)
jne이기 때문에 je로 바꿔주면 간단하게 분기문을 바꿀 수 있다
바꾸고 파일 패치 후 실행
분기문을 바꾸지 않고 코드 분석을 통해 하는 방법도 한 번 해 보겠다
주변 코드를 보면 cmp로 ebp-4를 0과 비교하는데, 이 ebp-4값이 어디서 왔는지를 확인해야 한다
찾아보면 바로 위에 mov ebp-4, eax하는 부분이 보인다
eax는 함수 수행 후 반환값을 가지고 오니까 무슨 함수의 결과가 ebp-4값인 것이다
그 함수는 당연히 그 바로 위에 call 07.401120일테고
함수를 보면 두 문자열을 비교하고 있다
즉, 함수는 strcmp이라 예상할 수 있고, 두 문자열을 동일하게 해 주면 jne 분기문을 넘어갈 수 있을 것이다
리버싱에서는 매개변수로 다른 문자열 두 개가 들어갔는데 반환값으로 1, 0이 나오면 strcmp함수를 보통 추정하게 된다고 한다
아까 문자열 maatch과 meetch에서 덤프에 주소지로 찾아서 406030으로 넘어간다
그러면 문자열 두 개가 나란히 있는 걸 볼 수 있다
문자열이 같게 해야 하니까 meetch를 maatch로 바꿔준다
jne는 같지 않을 때 점프니까 이제는 같아서 점프가 될 것이다
패치로 .exe파일로 저장해 준다
제대로 파일이 실행된다
'CTF > Reversing' 카테고리의 다른 글
[리버싱] 메모리 구조, 함수 호출 과정, Stack Frame (0) | 2020.08.30 |
---|---|
abex crackme 3번-keyfile채우기 (0) | 2020.08.26 |
리버싱-실행 프로그램 변경 (0) | 2020.08.26 |
리버싱-PE분석 및 수정 (0) | 2020.08.26 |
리버싱-문자열 탐색 (0) | 2020.08.26 |