본문 바로가기

4-2. 2024-1 심화 스터디/워게임 도장 깨기

[3주차] 2024.03.29 - Pwnable War Game Write Up

CTF Cite : https://play.picoctf.org

 

1. babygame01

  • WASD키로 움직이는 게임에서 FLAG를 획득하는 문제이다.

 

  • 먼저, 게임에 접속해 [@]가 있는 곳까지 움직여보았다. "You win!"만 출력될 뿐, FLAG는 출력되지 않았다.

 

  • 문제 힌트를 통해 시크릿 커맨드가 있는 것을 알 수 있었고, 이를 Ghidra를 이용하여 확인해보았다.

 

  • 두번째 if문을 통해 [p]가 시크릿 커맨드인 것을 발견할 수 있었다. 게임을 다시 시작하고, [p]를 누르면 바로 [@]의 위치까지 이동해 "You win!"만 출력한다.

 

  • 그 다음 IDA를 이용해 메모리와 코드를 분석해보았다.

  • 변수 v6과 v7을 살펴보면 다음과 같다.

 

v6 : var_A9C
v7[2700] : var_A98

 

  • 이를 통해 v6와 v7 사이에 4byte가 있는 것을 알 수 있었고, v6에 접근하여 [p]를 입력하면 FLAG를 얻을 수 있을 것이라 생각했다.

 

  • 따라서, 원점으로 이동한 뒤,

 

  • [a]를 4번 눌러 왼쪽으로 4칸 이동했다.

 

 

  • 그 후 [p]를 누르면 FLAG가 출력된다.

 

2. VNE

  • root 권한인 파일을 ls 명령어를 이용해 실행하는 문제이다.

 

  • 인스턴스를 실행하고, 서버에 접속한다.

 

  • 그 후 [ls], [ls -al] 명령어를 이용하여 현재 어떤 파일과 디렉토리가 있는지 확인해보았다.
  • 이때, bin 파일이 root에 속하고 있으며 setuid 플래그가 설정되어 있는 것을 확인할 수 있다. 이는 bin 파일을 실행할 때 해당 프로세스가 파일의 소유자인 root 사용자의 권한으로 실행된다는 것을 의미한다.

 

  • bin 파일을 실행해보니, SECRET_DIR이 설정되지 않아 오류가 발생한 것을 확인할 수 있었다.

 

  • SECRET_DIR의 값을 /root로 설정해보니 flag.txt를 확인할 수 있었다.

 

  • 따라서, SECRET_DIR의 값을 /root로 설정하고 동시에 flag.txt를 읽을 수 있도록 명령어를 입력하면 FLAG가 출력되는 것을 볼 수 있다.