1차 공개일 · 8월 20일1차 강의가 모두 공개됩니다
TECH 으로 돌아가기
TECH HACKER NEWS 오늘 8분 읽기 26 READS

구글 렌즈 대신 기하학과 CUDA로 무인도 위치를 찾아낸 OSINT 도전기

구글 렌즈 대신 기하학과 CUDA로 무인도 위치를 찾아낸 OSINT 도전기
SOURCE IMAGE · HACKER NEWS

위성 이미지 검색이 쉬워진 시대에도, 사진 한 장으로 지구상의 정확한 좌표를 역추적하는 일은 여전히 만만치 않다. 한 블로거는 소피아 산토스(Gralhix)가 낸 OSINT 연습문제 #004를 풀면서, 흔히 쓰는 구글 렌즈 역이미지 검색을 일부러 배제했다. 리조트가 있는 섬 사진을 놓고 '리조트 이름, 섬의 좌표, 촬영 당시 카메라가 향한 방위'를 알아내야 하는 문제였는데, 그는 이를 순수하게 기하학과 GPU 병렬 연산으로 풀어냈다. 이 접근은 실무적으로도 흥미롭다. 검색 엔진에 의존하지 않고, 지형 데이터셋과 계산만으로 후보를 좁혀가는 파이프라인이 어떻게 작동하는지 보여주기 때문이다.

사진을 지문으로 바꾸다

출발점은 메타데이터였다. 리눅스에서 확인했지만 EXIF도 GPS도 카메라 정보도 없었다. 드론 촬영이라 고도 추정이 불가능해 정밀한 조감도 투영 모델을 만들 수도 없었다. 그래서 그는 이미지 속 세 개의 육지 덩어리에 주목하고, 절대 위치 대신 세 섬이 이루는 삼각형의 상대적 거리와 각도만 뽑아내기로 했다. 직접 만든 클릭 GUI로 각 지점의 픽셀 좌표를 기록해 삼각형의 기하 정보를 계산했고, 눈대중 클릭의 오차를 고려해 각도와 거리 비율에 ±20%의 허용 범위를 뒀다. 이렇게 만든 '지문'이 이후 모든 대조 작업의 기준이 된다.

대조 대상은 OpenStreetMap의 전 지구 해안선 폴리곤 데이터셋(land-polygons-split-4326, 약 882MB)이었다. 여기에 그는 순전히 직관에 기댄 휴리스틱 필터를 며칠에 걸쳐 다듬었다고 털어놨다. 사진 속 섬이 열대처럼 보였기에 열대 밖 육지는 연산 전에 즉시 제거했고, 그 결과 14만 1,131개의 폴리곤만 남았다. 이어 5km 이내 이웃이 10개를 넘는 밀집 지형(암초 지대나 군도)은 배제하고, 20km 이내에 최소 2개의 이웃이 있어 삼각형을 이룰 수 있는 군집만 살렸다.

8천만 개 삼각형을 GPU로 검증

군집이 커지면 세 점 조합의 수는 C(n,3)로 폭발한다. 60개 점 군집만 해도 3만 4천여 조합이 나온다. 그래서 각 군집을 60개 점으로 상한을 두되, 무작위가 아니라 작은 섬·큰 섬·중간 크기를 각각 3분의 1씩 표본으로 뽑았다. 이렇게 2만 3,500개 군집에서 총 8,069만 개가 넘는 삼각형 후보가 만들어졌다. 여기서 CUDA가 등장한다. 삼각형 하나에 GPU 스레드 하나를 배정하고, 각 스레드가 세 점을 면적순으로 정렬해 가장 작은 섬을 리조트 섬(P0)으로 잡은 뒤, 2D 외적의 부호로 나머지 두 점의 좌우를 분기 없이 결정한다. 각도와 거리 비율을 계산해 지문의 허용 범위에 들어오면 원자적 카운터로 공유 배열에 결과를 기록한다. 8,070만 개가 들어가 15만 8,784개가 통과했다.

중복 삼각형을 정리한 뒤에는 물리적 조건을 덧붙였다. 사진처럼 한쪽이 탁 트인 바다여야 하므로, P0→P1 변을 따라 P2 반대편에 사각형을 그려 그 안에 다른 육지가 없는지 검사했다. 이 개방 수역 필터를 통과한 후보는 948개로 줄었다. 이어 P0의 형태가 산호섬(코럴 케이)답게 둥근지를 Polsby-Popper 점수로 따져 0.5 미만은 버렸고, 주변 1.5km에 0.05㎢ 미만의 작은 모래톱이 최소 하나 있는지, 최소 회전 사각형의 종횡비(1.05~2.2)와 채움 비율(완벽한 타원의 채움 한계 π/4의 75%인 약 0.589 이상)까지 확인했다.

실제 위성·고도 데이터로 마무리

마지막 단계는 계산이 아니라 네트워크에 의존하는 API 검증이었다. Element84가 운영하는 공개 STAC API인 Earth Search를 통해 AWS에 올라간 Sentinel-2 영상을 불러와, P0 지점의 적색·근적외 밴드로 NDVI를 계산했다. 야자수 같은 식생은 근적외를 강하게 반사하므로, 임계값 0.6을 넘겨야 실제 나무 덮개로 인정했다. 또 촬영 방위를 추정하기 위해 P1·P2로 향하는 방위각의 이등분선을 '정면'으로 잡고, 그 방향 ±50°·반경 2~20km 부채꼴을 Copernicus DEM GLO-30 고도 타일로 샘플링했다. P0 자체는 50m 이하로 낮으면서, 부채꼴 안 최고 고도가 100~500m 사이여야 한다는 조건을 걸었다.

이 모든 관문을 통과한 생존자는 26곳이었고, 대부분 남아시아·호주·오세아니아에 몰렸으며 한 곳만 브라질 근처였다. 각 후보에 국가명과 P0·P1·P2의 구글 지도 위성 링크를 붙인 HTML 표로 정리한 뒤, 그는 눈으로 하나씩 확인했다. 앞선 7곳은 명백히 아니었고, 8번째로 연 미크로네시아 후보에서 답을 찾았다. 최종 좌표는 북위 7도 21분 48.4초, 동경 151도 45분 20.7초였으며, 방위각 계산 결과 324.97도, 즉 카메라는 북서(NW) 방향을 향하고 있었다.

실무적으로 남는 것

이 사례가 IT 실무자에게 시사하는 바는 두 가지다. 하나는 공개 지리 데이터셋과 무료 STAC·DEM API만으로도 API 키 없이 상당한 지리공간 파이프라인을 구성할 수 있다는 점이다. OSM 해안선, Sentinel-2, Copernicus DEM, Natural Earth 경계 데이터가 모두 무료·공개로 활용됐다. 다른 하나는 GPU 병렬화의 실전적 쓸모다. 8천만 개 조합을 스레드당 하나씩 처리하는 구조는, 조합 폭발이 병목인 문제에서 CUDA가 얼마나 직관적으로 들어맞는지 보여준다. 다만 저자 스스로 여러 차례 인정했듯, 열대 여부·이웃 개수·형태 비율 같은 필터 값들이 대부분 '직관에 기댄 휴리스틱'이라는 점은 명백한 한계다. 임계값이 조금만 어긋나도 정답이 걸러질 수 있어 재현성과 일반화가 보장되지 않으며, 결국 마지막은 사람 눈으로 확인해야 했다. 검색 엔진 한 번이면 끝날 문제를 이렇게 푼 것은 실용적 효율보다 방법론 탐구에 가깝지만, 그 과정에서 드러난 데이터 접근성과 병렬 연산의 결합은 충분히 곱씹어볼 만하다.

SOURCE · HACKER NEWS
원문 전체 보기 → https://yassa9.github.io/osint/gralhix-004/
SHARE
NEXT · CHOOSE

변화를 읽었다면,
내가 만들 수익 구조를 고릅니다.

정보를 더 모으는 데서 멈추지 않고, 광고·외주·판매·중개·구독 중 내 상황에 맞는 출발점을 정해보세요.

21가지 수익 구조 살펴보기
처리 중...