문제가 주어졌다..
아이콘이 귀엽다
문제에서 알려준 것처럼 실행해봤더니 잘 실행됐다.
비밀번호를 알아내야 하는 것 같다.
다운 받은 두개의 파일을 아이다로 까서 분석했다.
의심가는 부분을 찾긴 했는데 대회 기간 내에 다 풀지 못했다 쩝
더 공부 해야지
--
대회가 종료되고 다른 외국 분의 풀이를 참고해서 풀어보았다.
Memory Leak을 찾아주는 툴인 valgrind 를 사용해서 익스코드를 작성한다.
import subprocess
flag = "uiuctf{" # flag 형식
baseline = 0
for j in range(64):
if flag[-1] == "}": # 마지막 문자가 '}'인 경우 루프 종료
print(flag)
break
l = len(flag)
for i in range(0x20, 0x7F, 1):
f = open('./flag.txt', 'w')
f.write(flag + chr(i))
f.close()
# valgrind를 사용하여 메모리 참조 분석을 수행
p = subprocess.Popen(
"valgrind --trace-children=yes --tool=callgrind ./chal program < flag.txt 2>&1 | grep refs | cut -d ' ' -f11",
stdout=subprocess.PIPE,
shell=True,
)
output = p.communicate()[0].strip(b"\n").split(b"\n")[-1]
output = output.decode().replace(",", "")
print(flag, chr(i), output)
if i == 0x20:
baseline = int(output) if output else baseline # 빈 문자열이 아닌 경우에만 변환
elif output and abs(baseline - int(output)) > 100: # 빈 문자열이 아닌 경우에만 변환 및 비교
flag += chr(i) # 플래그에 문자 추가
print(f"found: {chr(i)} ({output})")
print(f"flag : {flag}")
break
if l == len(flag): # 문자를 추가하지 못한 경우
print("try again")
break
이 코드를 실행하기 전에 valgrind를 먼저 터미널에서 사용해줘야 한다.
위 명령어를 실행하고 익스코드를 실행한다.
실행하게되면 위 사진과 같이 한 글자 한 글자씩 맞는 플래그를 대조한다.
인내심..을 가지고 기다리면 이렇게 플래그가 추출된다~
'CTF' 카테고리의 다른 글
[ ImaginaryCTF ] web (0) | 2023.07.22 |
---|---|
[AmateursCTF ] zipper (0) | 2023.07.22 |
[Google CTF 2023] PAPAPAPA | LEAST COMMON GENOMINATOR | UNDER-CONSTRUCTION (0) | 2023.06.26 |