[dreamhack] rev-basic-8 문제 풀이

목차

  • 문제 설명
  • 해결 과정
  • Exploit 코드
  • 문제 요약

문제 설명

- rev-basic-8번의 문제설명

rev-basic-8문제

 

이 문제 설명에 의해서 단순히 문자열 값을 입력받아 문자열이 맞았는지 판별하여 correct, wrong을 출력하는 프로그램입니다.


해결 과정

- x64dbg를 이용해 동적분석 후 FLAG값을 취득하는 과정

 

동작 방식 확인하기

Main함수 (추측)

이 함수는 사용자에게 Input값을 입력받아 chall8.7FF73713100 함수에서 값에서 FLAG인지 아닌지 판별해 eax에 값을 가져와서 0인지 아닌지를 통해 Correct, Wrong을 출력하는 함수임을 보아 메인함수로 추측해 볼 수 있다

chall8.7FF73713100함수

이함수는 rax의 값이 21인지 확인한후 n번째 문자열과 0xFB를 곱해서 0xFF와 and 연산을 하고, 7FF737133000주소에 있는 n번째 값들과 비교를 하고 맞다면 rax의 값에 1을 더하고 틀리다면 eax를 xor 연산하여 0으로 초기화 시키고 함수를 탈출하는 함수이다.

7FF737133000주소의 값들

 

 동작 방식 요약

  1. 사용자에게 값을 입력 받음
  2. eax값이 0x15인지 확인한다.
  3. eax값이 0x15라면 eax값을 1로 초기화 하고 8번으로 간다.
  4. 입력받은 값의 n번째 문자열을 0xFB를 곱한다
  5. 그 후 AND연산을 한다.
  6. 연산된 값을 7FF737133000주소의 n번째 값과 비교한다.
  7. 틀리면 xor연산하여 eax값을 0으로 초기화 하고, 맞다면 eax값을 1를 추가하고 2번으로 돌아간다.
  8. eax의 값이 0이라면 wrong을 출력하고, 0이 아니라면 Correct를 출력한다.

 

해결 방안

 이 함수는 역연산이 힘들거 같다. 그래서 키보드로 입력할 수 있는 0x21부터 0x7E까지 bruteforce기법을 활용해서, flag를 찾을 수 있을 것이다.


Exploit 코드

- Brute_force기법을 활용한 파이썬 코드

key = [0xAC, 0xF3, 0x0C, 0x25, 0xA3, 0x10, 0xB7, 0x25, 0x16, 0xC6, 0xB7, 0xBC, 0x07, 0x25, 0x02, 0xD5, 0xC6, 0x11, 0x07, 0xC5]
cnt = 0
for i in key:
    for j in range (0x21,0x7F,1):
        if (j * 0xFB) & 0xFF == i:
            print(chr(j),end="")
            break

 


문제 요약

 이 문제는 단순히 brute_force만 사용할줄 알면 손쉽게 풀 수 있는 문제 였다.

복사했습니다!