Dreamhack - littlevsbig

·2025년 9월 21일

Dreamhack-Writeups

목록 보기
40/52

littlevsbig

문제 링크

https://dreamhack.io/wargame/challenges/934

문제 설명

사용자에게 문자열을 입력받아 메모리에 저장하는 프로그램입니다. 저장된 값이 특정 값과 일치하면 플래그를 출력합니다. 알맞은 문자열을 입력하여 플래그를 획득하세요! 플래그는 flag 파일에 있습니다.

플래그의 형식은 DH{...} 입니다.

풀이과정

  1. 주어진 c 코드에서 플래그를 반환하는 코드를 찾습니다 .
    if(int_arr[0] == 0x64726d68 && int_arr[1] == 0x636b3a29){
        puts("Nice!");
        puts(flag);
    }

int_arr[0] 과 int_arr[1]이 각각 0x64726d68, 0x636b3a29 이면 플래그를 얻을 수 있는걸 알아냈습니다.

  1. 주어진 16진수를 문자로 변환합니다. (코드에 제시된 0x%x 을 통해 16진수로 변환된 문자임을 알 수 있습니다)


주어진 문자는 drmhck:) 임을 알 수 있습니다.

  1. 알아낸 문자열을 바로 입력해보았습니다. 리눅스 셸을 열고, 주어진 서버에 접속 한 다음, input 에 drmhck:) 을 입력하였습니다. 하지만 문제는 풀리지 않았습니다.

  1. 자세히 확인해보니 우리가 입력해야 할 문자열은 0x64726d68 인데 , 위의 arr 는 0x686d7264 로, 순서가 반대임을 확인할 수 있었습니다.
  2. 문자열의 순서를 바꾸어 다시한번 input 해 보았더니, 성공적으로 플래그를 획득할 수 있었습니다.

+) 문자열 순서가 바껴야 됐던 이유

코드에 제시된 16진수를 변환한 순서 그대로 입력하였는데 왜 문자열을 뒤집어서 입력한게 정답이 되는지 의문이 들어 알아보았습니다.

코드에서 제시된 정수 리터럴(예: 0x64726d68)을 아스키코드로 그대로 읽으면 "drmh"가 됩니다. 그런데 실제로 프로그램이 실행되는 환경(x86/x86-64 CPU)은 기본적으로 리틀엔디언 방식을 사용합니다. 리틀엔디언은 하위 바이트부터 메모리에 저장하는 방식이기 때문에, 메모리에 적힌 바이트 순서를 그대로 읽으면 우리가 기대한 문자열과 반대 순서인 "hmrd"가 됩니다. 따라서 입력할 때는 이 엔디언 차이를 고려해서 순서를 뒤집어야 합니다.


배운점

  • 리틀인디언 방식에 대해 처음 접해보게 되었습니다. 값을 입력할 때 컴퓨터가 어떻게 바이트를 읽는지에 대해서도 고려를 해야됨을 알게 되었습니다.
  • 0x%x가 정수를 16진수 소문자로 변환하는 형식 지정자 임을 알게 되었습니다.

Summary (English)

  • Found the condition in the provided C code that prints the flag when int_arr[0] == 0x64726d68 and int_arr[1] == 0x636b3a29.
  • Converted these hexadecimal values to ASCII and initially obtained the strings "drmh" and "ck:)".
  • Tried submitting the direct concatenation "drmhck:)", but it did not work.
  • Realized the issue was due to endianness: the system stores integers in little-endian order, so the byte sequence is reversed in memory.
  • Corrected the input by reversing the order, which successfully triggered the condition and revealed the flag.
  • Learned that on little-endian systems, input values must account for reversed byte order.
  • Also confirmed that %x in C format specifiers converts integers to hexadecimal strings.
profile
CTF 풀이 및 실습 중심 학습을 기록합니다.

0개의 댓글