Wargame/HackCTF

RTL_World Write-Up

LikeMermaid 2021. 9. 19. 08:49
728x90

1. rtl_world

1.1 파일 분석 1

- file 명령어로 rtl_world 파일의 종류를 확인해보니 32bit ELF 파일임

 

- rtl_world 파일을 실행했을때 얻을 수 있는 정보를 4가지로 나누어 정리함

① System Armor와 Shell Sword를 갖게 된다면 Binary Boss를 kill할 수 있음
② 현재 갖고있는 골드 현황을 표시해줌
③ 선택할 수 있는 메뉴를 보여줌
④ 사용자가 번호를 입력하여 원하는 메뉴에 진입할 수 있음

 

1.2 메뉴

1.2.1 메뉴 1 (Information the Binary Boss!)

- 해당 바이너리의 메모리 보호기법 적용 여부와 Binary Boss에 대한 정보를 출력함

 

1.2.2 메뉴 2 (Make Money)

- 1번~3번 메뉴가 추가로 존재하며 해당 메뉴 실행 시 아래와 같음
  1) Farming : +100 Gold
  2) Item selling : +300 Gold
  3) Hunting : +500 Gold

 

1.2.3 메뉴 3 (Get the System Armor), 4(Get the Shell Sword)

- 1000 Gold 상태에서 3번, 4번 메뉴를 실행하게 되면 Gold가 부족하다며 별다른 반응이 없음

 

1.2.4 메뉴 5 (Kill the Binary Boss!!!)

- [Attack] 이라는 문구를 출력하며 사용자에게 입력 값을 받음

 

1.3 파일 분석 2

- Gold를 획득할 수 있는 메뉴 2 의 로직을 아이다로 확인해보니 1, 2, 3번 외에 4번 이라는 Hindden number가 존재함

 

- 실제 바이너리에서 골드를 획득할 수 있는 메뉴 2번에서 4번을 입력해보니 많은 액수의 Gold를 획득할 수 있었음

 

- 많은 액수의 Gold를 가진 상태로 메뉴 3번을 실행해보니 System Armor의 메모리 주소를 출력함

 

- IDA로 메뉴 3번의 로직을 확인해보니 Gold가 1999 이하라면 'You don`t have gold'를 출력하고 그렇지 않다면 v6변수의 시작 주소를 출력함

 

- v6변수에 담긴 값을 확인해보니 system함수의 주소를 담고 있음

 

- 많은 액수의 Gold를 가진 상태로 메뉴 4번을 실행해보니 Shell Sword의 메모리 주소를 출력함

 

- IDA로 메뉴 4번의 로직을 확인해보니 Gold가 2999 이하라면 'You don`t have gold'를 출력하고 그렇지 않다면 s1변수의 시작 주소를 출력함

 

- v6변수에 담긴 값을 확인해보니 '/bin/sh' 문자열을 담고 있음

 

- 이로써 메뉴 3에서 시스템 함수 주소, 메뉴 4에서 '/bin/sh' 문자열 주소를 획득할 수 있었음

 

- 메뉴 5번에서 buf 변수에 최대 1024(0x400)bytes를 입력하여 버퍼 오버플로우를 할 수 있음

 

- 위의 조합으로 payload를 작성하여 익스플로잇을 함

 

1.4 poc

- 5번째 줄 : remote로 워게임 서버에 접속하기 위한 코드

- 7~8번째 줄 : 메뉴 2번 (Make Money)로 진입하는 코드

- 10~11번째 줄 : 4번(hidden number)을 입력하여 많은 액수의 Gold를 획득하는 코드

- 13~14번째 줄 : 메뉴 3번 (Get the System Armor)로 진입하는 코드

- 16~18번째 줄 : 시스템 함수 주소(Armor Adress)를 출력받아 32bit로 패킹해주는 코드

- 20~21번째 줄 : 메뉴 4번 (Get the Shell Sword)로 진입하는 코드

- 23~25번째 줄 : '/bin/sh'문자열 주소(Shell Sword)를 출력받아 32bit로 패킹해주는 코드

- 27~29번째 줄 : 메뉴 5번 (Kill the Binary Boss!!!)로 진입하는 코드

- 32번째 줄 : buf[128] + void *v6[4] + void *handle[4] + void *s1[4] 의 공간을 덮기위한 코드

- 33번째 줄 : SFP를 덮기 위한 코드

- 34번째 줄 : 시스템 함수 주소를 대입하는 코드

- 35번쨰 줄 : return address 부분을 더미값으로 덮는 코드

- 36번째 줄 : '/bin/sh'문자열 주소를 대입하는 코드

- 38번째 줄 : payload 코드를 확인하기 위한 출력문 코드

- 40번째 줄 : ':' 라는 데이터를 받은 후 payload에 담긴 값을 대상 서버에 전송하는 코드

- 42번째 줄 : 대상과 지속적으로 통신하기 위한 코드

 

1.5 결과

- 위에 작성한 코드(poc)로 flag를 따낼 수 있었음