약 1년 만에 풀어보는 리버싱.
작년 2학기 시스템 해킹 실습에서 과제로 4번까지 풀어봤다.
물론 다른 사람들 풀이를 참고해야 풀 수 있었지만 감을 잃지 않기 위해서...ㄹㅊㄱ
문제 파일을 받는다.
다행히 아직 안 지우고 남아있다.
이 문제는 64전용이라 x64dbg 실행파일을 열어줬다.
기본 설정으로 진입점 중단점에 체크해준다.
F7과 F8 키를 눌러서 한 번 쭉~ 넘겨봤는데
Input, correct, wrong 을 발견했다.
오른쪽 콘솔창에 Input에 알맞은 문자를 입력해야 correct가 나오는 듯 하다.
Input 부분에 중단점.
correct와 wrong으로 나누어지는 부분들에 중단점.
끝나기 전에 중단점을 각각 설정해줬다.
우선 abcdef를 입력해봤다.
correct 윗 줄을 보면 je 명령어가 있는데 jump equal의 약자이고,
그 윗 줄의 eax와 eax를 test 비교하여 만약 값이 같으면 점프하라는 뜻이다.
점프하면 wrong이 출력되고, 점프하지 않고 진행하면 correct를 출력하게 된다.

여기서 test 비교는 and 연산과 같다.
둘 중 하나가 0이면 값이 0이 되고, zf(zero flag)를 1로 세트.
abcdef를 입력하고 test 비교했더니 zf가 1로 바뀌었다.
wrong을 출력하는 부분으로 점프도 했따. 그럼 당연히 abcdef는 틀렸다는 뜻.
아마 test 전에 불러오는 함수에서 입력한 abcdef와 올바른 값을 비교하는 과정이 있을 것이다. 들어가보자.
대충 이런 과정이 나온다.
cmp rax, 12 (18번 비교) 공백 문자가 마지막에 들어갔던 것 같다. flag는 17자?
[movzx eax, byte ptr ds:[rcx+rax] // n번째 문자열 eax에 저장
[lea rcx, qword ptr ds:[7FF77BA63020] // rcx에 [7FF77BA63020] 주소 저장
[movzx eax, byte ptr ds:[rcx+rax} // eax에 (rcx+rax) 주소에 해당하는 값 저장
[lea rdx, qword ptr ds:[7FF77BA63000] // rdx에 [7FF77BA63000] 주소 저장
[movzx ecx, byte ptr ds:[rdx+rcx] // ecx에 (rdx+rcx) 주소에 해당하는 값 저장
[cmp eax, ecx] // eax와 ecx 값 비교
출처: https://mokpo.tistory.com/290 [MSS:티스토리]
이 형님 참고했습니다. 죄송합니다. 기억이 안 나서..ㅠㅠ 출처도 자동으로 넣어주네
위 함수는 [7FF77BA63000] 주소에 저장된 18개의 값과
[7FF77BA63020] 주소에 사용자가 입력한 문자의 값을 더한 주소에 존재하는 값을 비교하는 함수란다.
덤프로 쫓아가보니 [7FF77BA63000]는 함수에서 사용자 입력 값을 연산하고 최종적으로 비교하는 문자가 저장된 주소이다.
그 아래 [7FF77BA63020]부터 사용자 입력 값을 더한 주소에 위치한 값을 출력하기 위한 base 주소이다.
FLAG를 찾기 위해서는 비교하는 문자를 [7FF77BA63020] 주소 이후의 값에서 찾아내고, 해당 주소에서 base 주소를 뺀 나머지 값을 추적하면 된다.
겁나겁나겁나겁나겁이나 어렵다. 나는 이런 거 안 배웠는데... 맨날 알아서 해보라고 하고 풀이도 겁나 빨리 넘어가서 머리에 제대로 들어오지도 않았는데.......
아무튼
비교는 코드를 작성해서 진행한다.
미안하지만 이것도 혼자 짠 거 아님. 왜 이렇게 되는건지 알긴 하겠는데 ....
쉽지 않은 해커가 되는 길.
실행해보자.
Replac3_the_w0rld 숫자랑 영어 섞어서 flag 만드는 거 겁나 킹받네.
ㄴr는 5늘도 눈물을 흘린ㄷr... ㅋ
슛~~

ㅗ냥이
아 기억나는 건 x64dbg 프로그램 내에서 이리저리 왔다갔다 계산도 해가면서 답 찾는것밖에 없는데 드림핵 문제들은 다른 프로그램ㅁ도 쓰게 하고.. 이게 basic이고 이게 1단계라니 학습이나 들어볼까 평일은 시간이 안나니까 주말에 들어볼까...