Dreamhack/Dreamhack Wargame (Challenge)

[44] IT 비전공자 [dreamhack]rev-basic-2 문제 풀기

imaginefuture-1 2024. 10. 23. 08:07

엇 ㅋㅋ 생각해보니 풀이자 많은 순으로 문제를 풀다보니까 거꾸로 순서가 될 때도 있네

이게 더 재밌다!

 

 


꿀팁 하나 찾았다..

https://hyemzzzy.tistory.com/110

 

[x32dbg/x64dbg] 레지스터 창 없어져서 30분 동안 바보같이 찾았는데 어이없게 찾은 1초 해결방법

x32dbg / x64dbg 레지스터 창 없어졌을 때 찾는 방법 / 창 숨기기 서론 갑자기 리버싱 공부하려고 x32dbg 동적 디버깅 툴 사용하던 리버싱 초짜는 갑자기 레지스터창이 없어져서 당황하게 된다.... 30분

hyemzzzy.tistory.com

 

 

correct 문자열을 찾는다

 

chall112.7ff77b221000이 correct전 입력값이다

 

 

 

어셈블리어 공부해야하는데...ida 도와줘..

 

갑자기 편안해졌다

 

 

 

gpt:

 

이 코드는 C/C++에서 작성된 프로그램의 main 함수로 보이며, 다음과 같은 기능을 수행합니다. 각 부분을 자세히 설명해 드리겠습니다.

코드 분석

int __fastcall main(int argc, const char **argv, const char **envp)
{
  char v4[256]; // [rsp+20h] [rbp-118h] BYREF

  memset(v4, 0, sizeof(v4)); // v4 배열을 0으로 초기화
  sub_1400011B0("Input : ", argv, envp); // 사용자에게 입력을 요청
  sub_140001210("%256s", v4); // 사용자 입력을 v4 배열에 저장
  if ( (unsigned int)sub_140001000(v4) ) // v4에 대한 조건 검사
    puts("Correct"); // 조건이 참일 경우 "Correct" 출력
  else
    puts("Wrong"); // 조건이 거짓일 경우 "Wrong" 출력
  return 0; // 프로그램 종료
}
 
 

각 부분의 설명

  1. 함수 서명:
    • int __fastcall main(int argc, const char **argv, const char **envp):
      • __fastcall은 함수 호출 규약을 나타내며, 인자들을 빠르게 전달하기 위해 레지스터를 사용할 수 있음을 의미합니다.
      • argc: 프로그램의 인자 개수입니다.
      • argv: 각 인자를 저장하는 문자열 배열입니다.
      • envp: 환경 변수를 저장하는 문자열 배열입니다.
  2. 스택 변수 초기화:
    • char v4[256];: 크기가 256인 문자 배열을 선언하여 사용자 입력을 저장할 공간을 마련합니다.
    • memset(v4, 0, sizeof(v4));: v4 배열의 모든 요소를 0으로 초기화합니다. 이는 문자열을 사용할 때 안전성을 높이기 위해서입니다.
  3. 사용자 입력 요청:
    • sub_1400011B0("Input : ", argv, envp);:
      • 이 함수는 "Input : "라는 메시지를 출력하고 사용자에게 입력을 요청하는 것으로 추측됩니다. 이 함수의 구현은 제공된 코드에 없기 때문에 세부 사항은 알 수 없습니다.
  4. 입력 받기:
    • sub_140001210("%256s", v4);:
      • 이 함수는 사용자로부터 입력을 받아 v4 배열에 저장합니다. %256s 형식 지정자는 최대 256자의 문자열을 입력받도록 설정되어 있습니다. 이 부분도 함수의 구현에 따라 동작이 다를 수 있습니다.
  5. 조건 검사:
    • if ((unsigned int)sub_140001000(v4)):
      • sub_140001000 함수를 호출하여 v4 배열의 내용을 검사합니다. 이 함수는 입력된 문자열을 처리하고 결과를 반환하는 것으로 보입니다.
      • 반환 값이 0이 아니면 조건이 참으로 판단됩니다.
  6. 결과 출력:
    • puts("Correct");: sub_140001000의 결과가 참일 경우 "Correct"를 출력합니다.
    • puts("Wrong");: 결과가 거짓일 경우 "Wrong"을 출력합니다.
  7. 종료:
    • return 0;: 프로그램을 정상적으로 종료합니다.

요약

이 프로그램은 사용자에게 문자열 입력을 요청하고, 그 입력을 특정 조건에 따라 검사하여 "Correct" 또는 "Wrong"을 출력합니다. 함수 sub_140001000의 세부 구현에 따라 입력된 문자열의 유효성이나 정답 여부를 판별하는 로직이 있을 것으로 예상됩니다.

 


이제 풀이글을 보러가자..

 

 

 

https://velog.io/@hamham/%EB%93%9C%EB%A6%BC%ED%95%B5-rev-basic-2-%ED%92%80%EC%9D%B4

 

[드림핵] rev-basic-2 풀이

드림핵 리버싱 문제인 rev-basic-2을 풀어보았습니다 🔑

velog.io

https://mokpo.tistory.com/258

 

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

[Reversing] rev-basic-2 문제풀이 문제를 확인해보자. Correct를 출력하는 FLAG 값을 찾는 문제이다. 문제 파일을 x64dbg 프로그램으로 열어보자. correct를 출력하는 flag 값을 찾아야하기 때문에 문자열 참조

mokpo.tistory.com

https://s-wisdom.tistory.com/36

 

[리버싱]드림핵 rev-basic-2 풀이

이번 문제 역시 문자열 찾기로 main함수가 있는 부분을 찾았다. 0,1번과 비슷하게 입력을 받고 맞으면 correct 틀리면 wrong을 출력하는 문제이다. 이 부분에서 뭔가를 비교하는 것 같다. 뭔가 비교하

s-wisdom.tistory.com

https://hyunhe2e.tistory.com/121

 

[드림핵]rev-basic-2

# 문제문제 링크 | https://dreamhack.io/wargame/challenges/16 rev-basic-2Reversing Basic Challenge #2 이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프

hyunhe2e.tistory.com

gpt:

 

주어진 코드 조각은 C/C++ 언어로 작성된 함수 sub_140001000의 구현을 보여줍니다. 이 함수의 기능과 작동 방식을 단계별로 분석해 보겠습니다.

함수 서명

c
코드 복사
__int64 __fastcall sub_140001000(__int64 a1)
  • __int64: 함수가 64비트 정수를 반환함을 나타냅니다.
  • __fastcall: 호출 규약으로, 일부 매개변수를 레지스터를 통해 전달하여 성능을 향상시키기 위해 사용됩니다.
  • a1: 64비트 정수형 매개변수로, 함수 호출 시 전달되는 주소 또는 포인터입니다.

변수 선언

c
코드 복사
int i; // [rsp+0h] [rbp-18h]
  • i: 반복문에서 사용할 인덱스 변수입니다.

반복문

c
코드 복사
for ( i = 0; (unsigned __int64)i < 0x12; ++i )
  • 이 반복문은 0부터 18(0x12는 18의 16진수 표현)까지의 정수를 반복합니다.

18번 반복한다. 

조건문

c
코드 복사
if ( *(_DWORD *)&aC[4 * i] != *(unsigned __int8 *)(a1 + i) ) return 0LL;
  • 이 부분은 배열 aC에서 4바이트(32비트) 크기의 값을 가져와서, 매개변수 a1이 가리키는 메모리 위치에서 1바이트(8비트) 값을 가져와 비교합니다.
  • 만약 두 값이 다르면 0LL을 반환하여 함수가 종료됩니다. 이 경우는 입력값이 올바르지 않다는 것을 의미합니다.

 return 0이 false, return 1이 true

성공 조건

c
코드 복사
return 1LL;
  • 반복문이 끝까지 실행되고, 모든 비교가 성공적으로 통과하면 1LL을 반환합니다. 이는 입력값이 올바르다는 것을 나타냅니다.

전체적인 기능

이 함수의 전체적인 기능을 정리하면 다음과 같습니다:

  1. 목적: a1로 주어진 메모리 주소에 저장된 데이터를 검증하는 것입니다.
  2. 검증 방법:
    • aC라는 배열에서 특정 값들을 가져와 a1이 가리키는 메모리 주소의 값들과 비교합니다.
    • aC 배열은 전역 변수로 가정하며, 이 배열의 첫 18개의 4바이트(32비트) 값과 a1의 첫 18개의 1바이트(8비트) 값을 비교합니다.
  3. 결과:
    • 모든 값이 일치하면 1을 반환하고, 하나라도 다르면 0을 반환합니다
    • aC라는 배열에서 특정값을 알면 될 것 같다

사용 예시

  • 이 함수는 특정 입력값이 기대하는 형식이나 내용을 충족하는지 검사하는 데 사용됩니다. 예를 들어, 사용자 입력 값이 미리 정의된 비밀번호, 키 또는 특정 형식의 데이터를 확인하는 데 유용할 수 있습니다.

결론

이 함수는 특정 조건을 만족하는지 확인하여 성공 여부를 판단하는 검증 기능을 수행합니다. 따라서 함수가 반환하는 값을 기반으로 프로그램에서 입력의 유효성을 검사할 수 있습니다.

 

 


 

aC를 누르면 이렇게 값이 나온다 

Comp4re_the_arr4y

 

 


64dbg를 이용하는 방법은 이렇다

아까봤던 화면이다 cmp 주목한다

[cmp rax, 12] 를 통해 문자열을 0x12번 비교한다는 것을 알 수 있다.
문자열 비교 구문은 [cmp dword ptr ds:[rcx+rax*4], edx] 이다.
사용자가 입력한 edx 값과 (rcx+rax*4) 값을 비교하는데 rcx 에 무슨 값이 들어가는지 확인하면 된다.
rcx는 [lea rcx, qword ptr ds:[7FF77B223000] 구문을 통해 해당 값이 들어있는 주소를 확인할 수 있다.
주소를 따라가 값을 확인해보자.

출처:https://mokpo.tistory.com/258 [MSS:티스토리]

 

 

마우스 우클릭 덤프에서 따라가기, 상수 chall2. 00007FF77B223000 클릭

 

 

 

flag가 보인다.