티스토리 뷰


본선에 출제되었던 문제였는데 UAF문제이다. 바로 분석해보겠다.



elf 32bit이다.

canary와 nx가 활성화 되어있다.



main 윗부분에 while(1)을 돈다.


index 함수는 내가 rename한 그냥 바이너리 실행 처음 화면이다.

대충 이런 메뉴들이 있다.

다시 메인으로 돌아와서 보면


아까 index()를 기반으로 switch ~ case 구문이 있다.




buf를 read로 입력 받기 때문에 case 1,2,3,4 정수형이기에 파이썬으로 \x01이런 식으로 보내줘야 한다.


먼저 case1부터 분석하겠다.


case1은 Buy cat 고양이를 사는 case이다.


ptr은 0으로 초기화가 되어있다. case1을 두번 불르면 ptr에는 값이 들어가서 You already ~ 문을 puts한다.


처음 case1을 사용할때에는 ptr의 malloc으로 4byte만큼 할당을 해준다.

그리고 함수포인터 ptr에는 mew(rename함) 라는 함수의 주소를 넣어준다.


이 함수는

그냥 mew~를 puts해준다.


좀 더 분석해보자.


case 2이다.


index에 의하면 case 2는 sell cat 고양이를 파는 case이다.


마찬가지로 ptr에 값이 들어가있는지 없는지 확인을 한다. ptr에 값이 있으면 free를 통해 cat을 sell해주는 컨셉인 것 같다.



case3을 분석해보자.


index에 의하면 mew라는 거다.


ptr에 값이 있으면 함수포인터 ptr을 실행한다. 아까 1번에서 mew를 puts하는 함수의 위치를 넣었으니 그 함수가 실행될 것 이다.


이제 중요한 case4를 분석해보자.


realloc(rename함) 어떤 함수를 호출한다.


malloc을 해준다.


엇 느낌이 싹 왔다.


아까 1번을 통해 malloc을 해주고 2번을 통해서 free할 수 있고.


4번을 통해 다시 malloc을  할 수 있다. -> uaf 취약점이 발생한다.


엇 근데 malloc해주는 크기와 malloc한 공간에 data값을 입력으로 바꿀 수 있다.


uaf를 통해 같은 위치에 data값을 변경할 수 있으면 내가 원하는 위치로 함수포인터 값을 변경할 수 있고 3번 메뉴였던 함수를 호출해주는 부분에서 내가 수정한 부분으로 jump할 수 있을 것이다.


그렇다면 문제에서 주어진 함수가 있지 않을까 찾던도중.

string view에서 저런 string을 확인 할 수 있었다.








이 함수를 찾을 수 있었다.


함수의 시작 위치는 0x80488B6이다.


uaf취약점을 통해 함수포인터의 값을 저 주소로 바꿔주면 될 것이다.


밑에는 익스플로잇 코드이다.



1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

from pwn import *

s = process("./catshop")

magic = 0x80488B6

s.recvuntil('choice:\n')

s.send('\x01')

s.recv()

s.send('\x02')

s.recv()

s.send('\x04')

s.recv()

s.send('0x04')

s.recv()

s.sendline(p32(magic))

s.recv()

s.send('\x03')

print (s.recvline())

cs



실행을 하면,

그 경로에 있던 파일을 cat해주는 것을 볼 수 있다.


FLAG{HY0m_kn0w_U4F..}

'pwnable > CTF write-up' 카테고리의 다른 글

[BCTF 2016] bcloud write-up  (0) 2018.07.28
사이버 가디언즈 1차전 pwn, miscwrite-up  (0) 2018.06.29
[Codegate 2016] watermelon write-up  (0) 2018.05.24
[CSAW2013] exploitation-2 write-up  (0) 2018.05.14
[trustealth]easy write-up  (0) 2018.05.13
Comments