CTF/포너블

[DwagCTF] Tom Nook the Capitalist Racoon - 포너블 / Pwntool

SecurityMan 2022. 4. 16. 08:30

 

포너블 문제

 

대회가 끝나고 풀어서 캡쳐가 조금 미흡하다.

 

해당 문제가 포너블로 분류되어있긴 했는데, 포너블이라고 보기엔 좀..

 

반응형

 

이 문제는 동물의 숲 게임을 모티브로 해서 만들어진 문제이다.

 

참고로 문제 제목에 나오는 Tom Nook은 동숲에서 대출해주는 너굴이다.

 

 

animal_crossing 이라는 ELF 파일이 하나 주어진다.

 

ELF파일은 리눅스에서 실행가능한 파일로 리눅스의 EXE파일이라고 생각하면 된다.

 

 

해당 파일을 실행시키면 이런 문자들이 출력된다.

 

동물의 숲을 간단하게 커맨드 라인으로 구성한 프로그램인듯 하다.

 

1, 2, 3을 입력해서 각 메뉴를 선택할 수 있다.

 

 

1을 입력해서 물건 팔기로 들어가본다.

 

그럼 내가 가지고있는 물건들을 팔 수 있다.

 

하나 팔면 800 ~ 900 벨 정도를 벌 수있나보다.

 

 

이번에는 2를 입력해서 물건 사기로 들어가본다.

 

일단 내가 지금 가지고 있는 돈은 8,500벨이다.

 

맨 밑에보면 플래그를 팔고있는걸 볼 수 있는데 420,000벨이나 한다.

 

플래그를 사기엔 가진돈이 턱없이 작다.

 

 

일단 이것저것 테스트하면서 물건을 한번 팔아봤다.

 

flimsy axe를 팔아봤더니 800벨을 주고,

 

인벤토리에 원래 있었던 flimsy axe가 사라진 것을 볼 수 있다.

 

여기까진 문제가 없다.

 

 

취약점은 상점에서 산 물건을 다시 되팔때 발생한다.

 

8,500벨이 있는 상태로 상점에 들어가서 8,000벨짜리 타란튤라를 구매해봤다.

 

구매하고나서 물건 팔기 메뉴로 간 뒤 아까 구매했던 타란튤라를 바로 팔았다.

 

그런데 다시 인벤토리 창으로 가봤더니 타란튤라가 그대로 남아있었다.

 

일종의 버그인 것이다.

 

상점에서 산 물건은 팔아도 계속 인벤토리에 남아있고, 무한으로 팔 수 있다.

 

이렇게 돈을 벌어서 420,000벨 짜리 플래그를 사면 되는 것이다.

 

일일이 수작업으로 돈을 벌어서 문제를 풀어도 되지만 매우 귀찮은 반복작업이다.

 

코딩을 해서 풀어보자.

 

이런 바이너리 파일이 주어진 문제를 풀때 Pwntool 을 자주 이용한다.

 

 

Pwntool은 파이썬 라이브러리이다. 만약 Pwntool이 없다면 

 

pip3 intsall pwn 명령어로 쉽게 설치할 수 있다.

rom pwn import *

p = process('./animal_crossing')

p.sendline(b'1') #물건 팔기
p.sendline(b'1') #flimsy axe 팔아서 인벤토리 한칸 비우기

p.sendline(b'2') #물건 사기
p.sendline(b'2') #타란튤라 구입

for i in range(53):
    p.sendline(b'1') #물건 팔기
    p.sendline(b'1') #타란튤라 팔기 x 53번

p.sendline(b'2') #물건 사기
p.sendline(b'6') #flag 구입
p.sendline(b'1') #물건 팔기(인벤토리 확인)

p.interactive()

 

exploit 코드는 위와 같다.

 

조금 헷갈릴 수도 있을거 같아서 주석을 옆에 달았다.

 

먼저 타란튤라를 구입하기 전에 인벤토리를 한칸 비우려고 axe를 팔았다.

 

그다음 타란튤라를 구입하고, 버그를 이용해서 타란튤라를 53번 판다.

 

8,000 * 53은 424,000이니 flag를 구매하기엔 충분한 액수이다.

 

돈이 다 모이면 flag를 구입하고, 인벤토리를 확인하기 위해 물건 팔기 메뉴로 들어간다.

 

 

코드를 실행시키면 이렇게 자동으로 반복작업을 수행해준다.

 

 

조금만 기다리면 flag를 구입해서 그 내용을 확인할 수 있다.

반응형