본문 바로가기

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

[6주차] 2024.05.10- Reversing War Game Write Up

[Reverse]

  •  파일의 비밀번호를 잊었다고 한다.

  • ret file에 대한 정보

 

  • 파일을 실행하기 위해 ./ret 명령어를 입력하였으나, 권한이 금지되었다.

리눅스에서의 권한 설정 명령어 참고 사이트

리눅스 권한 설정 (chmod, chown, chgrp)

 

리눅스 권한 설정 (chmod, chown, chgrp)

1. 파일 권한 확인 ls -al 2. 파일 권한 설정 -rw-r--r-- 1 root root 0 2월 24 16:20 testfile2 testfile2파일의 소유자는 root이고 권한은 소유자(읽기/쓰기)권한, 그룹(읽기)권한, 다른 사용자(읽기)권한 - 파일표시

danmilife.tistory.com

  • chmod [권한] [변경할 파일 혹은 디렉토리]

  • chmod u+x ret
  • 권한 변경 후, ret 파일을 다시 실행해보니 파일이 잠겨있으므로 비밀번호를 입력하라고 나온다.
  • 단서가 없으니 아마 정상적으로 파일을 실행하거나 하기에는 어려워 보인다.

리눅스 strings 명령어

리눅스 명령어 / strings 명령어 - 문자열만 추출하여 출력하기

 

리눅스 명령어 / strings 명령어 - 문자열만 추출하여 출력하기

리눅스 명령어 / strings 명령어 - 문자열만 추출하여 출력하기 strings 명령어는 실행파일의 ASCII 문자를 찾아 화면에 출력합니다. 바이너리 파일 또는 오브젝트 파일에 있는 모든 인쇄 가능한 문자

zidarn87.tistory.com

  • strings 명령어를 사용해서 파일 안에 있는 문자열 중, 플래그를 찾을 수 있었다.

  • 이렇게 grep 명령어를 써도 된다.

[Ready Gladiator1]

hint) You may be able to find a viable warrior in beginner docs

  • 한번이라도 승리할 수 있도록 해야한다.

  • 아이다로 로드해서 디컴파일을 통해 파악하려 시도해보았지만, PE파일이 아니라 열리지 않는 것 같다.
  • 우분투에서 cat명령어를 사용해서 파일 내용을 확인해보자.

;recode // 레드코드로 작성되었음을 의미
;name Imp Ex
;assert 1 // 프로그램이 현재 설정과 실제로 작동하는지 확인하는 데 사용
mov 0, 1
end

여기서 의문점이 하나 생겼다. 파일에서는 mov 0, 1 명령어를 사용하여 0의 값을 1로 바꿔준다는 점을 확인할 수 있었다. (사실, 확장자는 red로 되어있긴 하지만 어셈블리어 명령어가 보이니 해당 명령어를 동일한 기능을 하는 것으로 간과하여 생긴 문제같다.) 하지만, 이를 실행시킨 결과를 위에서도 볼 수 있듯이 warrior1이 이기지 않은 것을 확인할 수 있다. hint와 구글링을 통해 이유를 찾아보았다.

이 문제를 풀기 위해서는 'CoreWar'이라는 컴퓨터 게임을 이해해야 할 것 같다. 실제로 잘 모르겠어서 해설을 구글링해봤지만, 왜 이런 구문을 써야하는지 이해가 가질 않아 며칠 째 해결되지 못한 난제로 남아있었다.

1. CoreWar란?

프로그램끼리 서로 싸우도록 한 게임
이 게임에서의 각 프로그램 목적 : 다른 프로그램들을 죽이는(종료시키는) 것

 

2. red코드에서의 mov 0, 1 의미

mov 0, 1

이 코드가 실행되면 현재 실행되는 명령어 위치를 바로 다음 메모리 공간에 복사하게 된다. 그 결과,

mov 0, 1
mov 0, 1

이런 상태가 된다. 이후, 두 번째 명령어를 실행하게 되고(동일한 명령어) 똑같이 'mov 0, 1' 을 복사하게 된다. 이러한 상황이 무한히 반복되게 된다.

이를 비유하자면, 메모리 공간에서 족적을 남기면서 돌아다니게 되는 것이고, 다른 프로그램이 있다면, 그 프로그램을 죽이게 된다.(덮어쓰는 것을 의미) 따라서 다른 프로그램이 존재하지 않는다면 무한루프를 돌고 있는 것과 동일한 상황이 되는 것이라고 생각하면 될 것 같다.

따라서 게임에서 이기려면 다른 방법을 사용해야 한다.

3. 적어도 한 번 이길 수 이는 red코드 찾기

ADD #4, 3 
MOV 2, @2
JMP -2
DAT #0, #0

[로직]
1. 3을 더한 위치(4번 위치)에 4 더한다 <4번의 자료값이 4로 증가>
2. 여기서 2를 더한 위치(4번 위치)에 있는 내용을 2를 더한 위치(4번 위치)에 있는 값이 지시하는 주소에 복사한다. <8번 위치(4+4)에 복사>
3. 여기서 2 명령어 이전(전 1번 위치)로 돌아간다 <4번의 저장소에 다시 4를 더함>
4. 자료값 0의 저장 위치

이를 반복하면 4칸씩 건너뛰면서 'DAT #0, #0을 복사한다. 이 프로그램은 총 길이가 마지막 4번을 제외하면 3이기 때문에 메모리가 끝에서 다시 처음으로 이어져 있더라도 만약 총 크기가 4의 배수이기만 하면 자기 자신을 손상하지 않고 무한 반복하는 것이 가능하게 된다.

따라서 위 코드를 사용하게 된다면 자기 프로그램은 피해입지 않으면서 무한반복하며 다른 프로그램이 존재하면 종료시키는 것이 가능하게 되는 것이다.

공격 수행 코드)

ADD #4, 3 
MOV 2, @2
JMP -2
DAT #0, #0