본문 바로가기
étude/reverse engineering

rev_basic_0

by mummoo 2022. 11. 2.

문제

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

풀이과정

1. 바이너리를 입력한 후 correct값을 찾아야 한다는 것은 알고 있었지만
그래도 예의상 입력을 해봤닿

2. correct 또는 wrong이 분기점을 기준으로 설정되었을 것이고,
jump 명령어가 그 기준이었을 것이다.
그런데 일단 너무 길어. correct랑 wrong 부터 찾아야겠다.
=> 어떻게 찾지 : 16진법으로 표현되었으려나 : 어디에 써져 있지


=> 라고 계획을 세워봤으나, 결국
입력 함수를 찾기 위해서 들어간 함수 영역에서

2.

찾았다 요놈

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

chall0.sub_7FF6BB9F1000

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

더보기

<삽질 >

문자열 비교하라는 거 보니까 진짜 반복문이 맞는 것 같다.

rcx에 rsp값 + 40만큼을 넣고

&strcmp 함수를 호출한다.

  1. rdx = rdx - rcx
  2. cl = rcx의 하위 8bit : 아무튼 test cl, 7했을 때 ZF = 0 : cl != 1000 / 0000
    1. cl == 7 : r11에 8080...80 값 저장
    2. r10에 FEFE...FF 값 저장
    3. eax에 4Byte짜리 edx값 + ecx값 저장
    4. eax = eax(=edx값 + ecx값) & FFF
    5.  eax > = < FF8 ?
      1. eax>FF8 : eax 확장 후 rcx 저장
      2. al과 rdx+rcx값 비교
      3. if (al ==rdx) rcx + 1 해주기 // 다르면 rax = 0 저장, rax와 1 or 연산 = 1을 rax에 저장
      4. al에 0 저장되어 있으면 함수 끝냄.
      5.  al에 0 이외의 값이 있으면 이 부분반복
      6. eax <= FF8 : rax에 rcx 값 대입
      7. rax == rdx+rcx 
      8. -> r9에 rax값 + r10값 넣고 (not rax가 뭐지)/ rcx = rcx+8 / rax = rax & r9 / rax = r11 이어야함
    6. cl != 7 : 이 부분 반복
    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 실행 시

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