문제
이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로
입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니다.
해당 바이너리를 분석하여 correct를 출력하는 입력값을 찾으세요!
풀이과정

1. 바이너리를 입력한 후 correct값을 찾아야 한다는 것은 알고 있었지만
그래도 예의상 입력을 해봤닿
2. correct 또는 wrong이 분기점을 기준으로 설정되었을 것이고, jump 명령어가 그 기준이었을 것이다. 그런데 일단 너무 길어. correct랑 wrong 부터 찾아야겠다.=> 어떻게 찾지 : 16진법으로 표현되었으려나 : 어디에 써져 있지
=> 라고 계획을 세워봤으나, 결국
입력 함수를 찾기 위해서 들어간 함수 영역에서
2.

찾았다 요놈

call chall0.sub_7FF6BB9F1000 실행 후 eax에 값이 있으면 correct 출력
=> chall0.sub_7FF6BB9F1000에 들어가서 어떤 문자열과 비교를 하는지 확인해봐야 한다.

여기서 <JMP .&strcmp>결과 eax = 0이어야 eax에 1이 저장되어서 값 반환
그래서 함수 타고 들어가봤다.
<삽질 >

문자열 비교하라는 거 보니까 진짜 반복문이 맞는 것 같다.
rcx에 rsp값 + 40만큼을 넣고
&strcmp 함수를 호출한다.



- rdx = rdx - rcx
- cl = rcx의 하위 8bit : 아무튼 test cl, 7했을 때 ZF = 0 : cl != 1000 / 0000
- cl == 7 : r11에 8080...80 값 저장
- r10에 FEFE...FF 값 저장
- eax에 4Byte짜리 edx값 + ecx값 저장
- eax = eax(=edx값 + ecx값) & FFF
- eax > = < FF8 ?
- eax>FF8 : eax 확장 후 rcx 저장
- al과 rdx+rcx값 비교
- if (al ==rdx) rcx + 1 해주기 // 다르면 rax = 0 저장, rax와 1 or 연산 = 1을 rax에 저장
- al에 0 저장되어 있으면 함수 끝냄.
- al에 0 이외의 값이 있으면 이 부분반복
- eax <= FF8 : rax에 rcx 값 대입
- rax == rdx+rcx
- -> r9에 rax값 + r10값 넣고 (not rax가 뭐지)/ rcx = rcx+8 / rax = rax & r9 / rax = r11 이어야함
- cl != 7 : 이 부분 반복
test eax, eax에서 ZF = 0이기 때문에 jne로 가게 되고
rsp+20 4Byte에 0을 저장하고
eax에는 rsp+20의 값을 저장하고
함수를 반환한다.
-삽질 중단-
풀이가 너무 길어져서 풀이 방향을 바꿔봤다.
strcmp = 문자열을 비교하는 라이브러리 함수
(아 string compare 인가)
strcmp (앞 문자열, 뒷 문자열) = strcmp는 앞뒤의 문자열을 비교 , ASCII코드로 하나씩 비교
=> 앞의 문자열이 크다면 -1, 같다면 0, 작다면 1 반환근데 여기에서 앞뒤의 문자열이 뭔지 모르겠는데참고용이군
아니 근데 진짜 접은 글 안의 풀이 적다가 아닌 것 같아서 문제 포기하려고 했는데
chall0.sub_7FF6BB9F1000 실행 시

여기로 계속 가서 문자열을 검증하는 것을 알 수 있었다.
주석에 있는 저 "Compar3_the_str1ng"이 특정 행동들의 이름인 줄 알았는데
큰따옴표가 있어서 문자열이라는 것을 뒤늦게 깨달았다.
그래서 혹시..? 싶어서 "Compar3_the_str1ng" 입력해봤는데

근데 JMP .&strcmp 얘 검색하면 이 문제의 writeup이나 (앞의 문자열 vs 뒤의 문자열) 내용만 나와서
뭔지 구글링만으로는 해결을 못하겠습다....
이게 뭐죠
아무튼 답은 Compar3_the_string
'étude > reverse engineering' 카테고리의 다른 글
dreamhack : rev_basic_1 (2) | 2023.01.12 |
---|---|
dreamhack : rev_basic_0 (1) | 2023.01.10 |
easy_crackme1 (0) | 2023.01.07 |
rev_basic_1 (2) | 2022.11.02 |
writeup__easycrackme1 (0) | 2022.10.09 |