13 min read

AI는 왜 리버스 엔지니어링을 이렇게 잘할까?

1. AI는 왜 리버스 엔지니어링을 이렇게 잘할까?

최근 AI를 활용해 기존 소프트웨어를 분석하고, 유사한 기능을 구현하거나 심지어 복잡한 도구를 재현하는 사례가 늘어나고 있다.

이런 사례를 볼 때마다 한 가지 의문이 들었다.

"AI는 복잡한 프로그램을 역분석해서 비슷하게 만드는 일은 이렇게 잘하면서, 왜 간단한 서비스를 처음부터 만들어 달라고 하면 어딘가 부족한 결과물을 내놓을까?"

그리고 또 다른 의문이 생겼다.

"왜 전문지식이 있는 사람은 AI를 활용해 놀라운 결과물을 만들어 내는데, 초보자는 같은 AI를 사용하면서도 비슷한 결과를 얻지 못할까?"

단순히 프롬프트를 잘 작성하는 사람과 그렇지 못한 사람의 차이일까?

물론 프롬프트도 중요하다. 하지만 개인적으로는 그보다 근본적인 원인이 있다고 생각한다.

바로 문제를 정의하는 능력과 결과물을 검증하는 능력의 차이다.

AI는 이미 정의된 문제를 해결하는 데 매우 강하다. 반면, 무엇을 만들어야 하는지조차 명확하지 않은 상황에서는 그럴듯하지만 불완전한 결과를 만들어 내기 쉽다.

이 차이를 이해하면 왜 AI가 어떤 분야에서는 천재처럼 보이고, 어떤 분야에서는 멍청하게 느껴지는지 설명할 수 있다.

2. AI가 멍청해 보이는 이유: 질문이 부족하다

예를 하나 들어보자. 사용자가 AI에게 다음과 같이 요청했다고 가정하자.

"가계부 애플리케이션을 만들어 줘."

현재의 AI는 이 요청만으로도 상당히 그럴듯한 애플리케이션을 만들어 낼 수 있다. 수입과 지출을 입력하는 화면, 거래 내역 목록, 월별 통계, 카테고리별 그래프까지 구현할 수 있을 것이다. 심지어 UI도 제법 예쁘게 만들어 줄 수 있다.

처음 보는 사람 입장에서는 놀라울 것이다. "이 정도 설명만 했는데 애플리케이션을 만들어 준다고?"

하지만 여기에는 중요한 문제가 있다. AI가 만들어 낸 것은 사용자가 정말 원했던 가계부가 아니라, AI가 일반적인 가계부라고 판단한 결과물일 가능성이 높다.

실제 회사에서 가계부 서비스를 개발한다고 생각해 보자. 기획자, 디자이너, 백엔드 개발자, 클라이언트 개발자, QA 담당자는 각자 다른 질문을 던질 것이다.

  • 기획자: 타깃 사용자는 누구인가? 어떤 문제를 해결하려는 서비스인가? 다른 가계부와 차별점은 무엇인가?
  • 디자이너: 사용자가 가장 자주 사용하는 기능은 무엇인가? 입력 과정은 얼마나 단순해야 하는가?
  • 백엔드 개발자: 서버가 필요한가? 계정과 데이터 동기화는 어떻게 할 것인가?
  • 클라이언트 개발자: 오프라인에서도 사용할 수 있어야 하는가? 데이터베이스는 무엇을 사용할 것인가?
  • QA 담당자: 중복 거래가 발생하면 어떻게 처리하는가? 잘못된 데이터를 입력하면 어떻게 되는가?

여기서 끝이 아니다. 서비스를 출시한 이후에는 더 많은 문제가 등장한다.

  • 사용자가 휴대폰을 변경하면 기존 데이터는 어떻게 이전할까?
  • 데이터베이스 스키마가 변경되면 기존 사용자 데이터를 어떻게 마이그레이션할까?
  • 여러 기기에서 동시에 수정한 데이터가 충돌하면 어떻게 처리할까?
  • 금액 계산에서 부동소수점 오차가 발생하지 않도록 어떻게 설계할까?
  • 백업에 실패하거나 애플리케이션이 비정상 종료되면 어떻게 복구할까?

이러한 문제들은 단순히 코드를 작성하는 문제가 아니다. 서비스를 설계하고 운영하기 위해 사전에 결정해야 하는 요구사항들이다.

그런데 사용자가 "가계부 앱을 만들어 줘"라고 요청하면 AI는 이런 질문을 충분히 하지 않은 채 구현을 시작하는 경우가 많다.

물론 AI가 역질문을 전혀 할 수 없다는 의미는 아니다. 명시적으로 요구하면 질문할 수 있고, 일부 AI 에이전트는 필요한 사항을 먼저 확인하기도 한다. 그러나 기본적인 상호작용에서는 불분명한 부분을 일반적인 가정으로 채운 뒤 작업을 진행하는 경향이 있다.

이것이 문제다. 사용자가 정의하지 않은 요구사항을 AI가 임의로 결정하는 순간, 결과물은 사용자의 실제 의도에서 멀어질 수 있다. 그럼에도 겨으로는 그럴듯하게 작동한다.

더 위험한 점은 사용자가 해당 분야를 잘 모르면 무엇이 빠져 있는지조차 알아차리기 어렵다는 것이다.

3. 전문가와 초보자가 AI를 사용할 때 결과가 다른 이유

같은 AI 모델을 사용하더라도 전문가와 초보자의 결과물이 크게 다른 이유는 무엇일까? 나는 그 차이가 크게 세 가지에서 발생한다고 생각한다.

첫 번째, 전문가는 무엇을 요청해야 하는지 알고 있다

초보자는 대체로 결과물 자체를 요청한다.

"가계부 앱을 만들어 줘."

반면 전문가는 해결해야 할 문제를 구체적으로 정의한다.

"Android용 오프라인 우선 가계부를 구현하려고 한다. 로컬 데이터는 Room으로 관리하고, 금액은 정수형 최소 통화 단위로 저장한다. 추후 서버 동기화를 고려해 데이터 모델을 설계하고, 스키마 변경에 따른 마이그레이션 전략도 포함해 줘. 코드를 작성하기 전에 결정되지 않은 요구사항과 설계상 위험 요소부터 정리해 줘."

두 요청은 같은 가계부 앱을 만들자는 이야기지만 AI가 처리해야 하는 문제의 명확성이 다르다.

전문가는 이미 자신이 겪었던 문제, 앞으로 발생할 가능성이 높은 문제, 기술적인 제약사항을 알고 있다. 그 지식을 바탕으로 AI의 작업 범위를 좁혀 준다. 이렇게 되면 AI는 불필요한 가정을 줄이고 명확한 목표를 향해 작업할 수 있다.

두 번째, 전문가는 결과물의 문제점을 발견할 수 있다

AI가 코드를 작성했다고 가정해 보자. 초보자는 애플리케이션이 실행되고 버튼이 동작하면 성공했다고 생각할 수 있다. 반면 전문가는 다른 부분을 살펴본다.

  • "이 구조는 나중에 유지보수하기 어렵겠는데?"
  • "동시성 문제가 발생할 수 있지 않을까?"
  • "데이터가 많아지면 성능 문제가 생기겠는데?"
  • "이 로직은 특정 예외 상황에서 실패하겠는데?"

전문가는 결과물이 동작하는지뿐 아니라 어떤 조건에서 동작하지 않을지도 생각한다. 이것은 매우 중요한 차이다.

AI가 잘못된 답변을 생성해도 전문가에게는 수정 가능한 초안이 된다. 반대로 초보자에게는 잘못된 답변이 그대로 최종 결과물이 될 수 있다.

세 번째, 전문가는 AI와 반복적으로 문제를 개선한다

전문가는 AI가 생성한 첫 번째 결과물을 정답이라고 생각하지 않는다. 결과물을 확인하고, 문제를 발견하고, 다시 수정하도록 요청한다. 이 과정이 반복된다.

이러한 반복 과정을 통해 결과물의 완성도를 높인다. 사람이 직접 구현하던 시절에도 동일한 과정이 존재했다. 차이가 있다면 AI는 구현과 수정에 필요한 시간을 크게 줄여 줄 수 있다는 점이다.

결국 AI를 잘 활용하는 전문가는 단순히 프롬프트를 잘 작성하는 사람이 아니다. AI가 무엇을 해야 하는지 결정하고, AI의 결과가 올바른지 판단할 수 있는 사람이다.

4. 그렇다면 AI는 왜 리버스 엔지니어링에 강할까?

여기서 처음의 의문으로 돌아가 보자. 왜 AI는 이미 존재하는 프로그램을 분석하고 유사하게 구현하는 일을 잘할까?

최근 흥미롭게 본 프로젝트가 하나 있다. REA(Reverse Engineer Anything)다.

REA는 AI 에이전트가 애플리케이션의 동작, 네이티브 바이너리, 웹사이트 등을 분석할 수 있도록 리버스 엔지니어링 도구를 연결하는 프로젝트다. 소스 코드가 없는 프로그램도 분석 대상이 될 수 있고, 분석 결과를 바탕으로 특정 기능이 어떻게 구현되어 있는지 파악하거나 유사 기능을 개발하는 데 활용할 수 있다.

이 프로젝트가 흥미로운 이유는 단순히 AI가 리버싱을 잘한다는 사실 때문이 아니다. 리버스 엔지니어링은 일반적인 신규 서비스 개발과 문제의 출발점이 다르기 때문이다.

리버스 엔지니어링에는 이미 정답에 가까운 대상이 존재한다

새로운 가계부 앱을 만든다고 가정해 보자. 어떤 UI가 좋은지, 데이터를 어떻게 저장해야 하는지, 어떤 기능이 필요한지 명확하게 결정되어 있지 않다. 이것은 여러 선택지 중에서 적절한 답을 찾아야 하는 문제다.

반면 기존 프로그램을 분석하는 경우는 다르다. 이미 동작하는 프로그램이 존재한다. 입력을 넣으면 출력이 나오고, 특정 버튼을 누르면 특정 동작이 발생한다. 파일을 넣었을 때 어떤 결과물이 나오는지도 관찰할 수 있다.

예를 들어 어떤 프로그램에 다음과 같은 기능이 있다고 가정하자.

  1. 특정 바이너리 파일을 입력받는다.
  2. 내부 데이터를 파싱한다.
  3. 사용자가 옵션을 선택한다.
  4. 정해진 형식으로 결과 파일을 출력한다.

이 프로그램을 재현하려면 무엇을 해야 할까? 입력과 출력을 관찰하고, 다양한 테스트 케이스를 만들어 내부 동작을 추론하면 된다. AI는 가설을 세우고, 코드를 작성하고, 원본 프로그램과 결과를 비교할 수 있다. 결과가 다르다면 가설을 수정하고 다시 실험하면 된다. 일종의 블랙박스 분석이다.

여기에는 신규 서비스 개발과 결정적인 차이가 있다. 무엇이 올바른 결과인지 비교할 수 있는 기준이 이미 존재한다는 것이다.

AI가 강한 이유는 명확한 피드백을 받을 수 있기 때문이다

리버스 엔지니어링 과정을 단순화하면 다음과 같다.

  1. 기존 프로그램의 입력과 출력을 관찰한다.
  2. 내부 동작에 대한 가설을 세운다.
  3. 동일한 동작을 수행하는 코드를 구현한다.
  4. 원본 프로그램과 결과를 비교한다.
  5. 차이가 발생한 부분을 수정한다.
  6. 결과가 일치할 때까지 반복한다.

이 구조는 AI 에이전트가 활용하기에 매우 적합하다. AI가 어떤 코드를 작성하더라도 그 결과가 원본과 동일한지 확인할 수 있기 때문이다.

물론 동일한 출력이 나온다고 해서 내부 구현까지 같다는 의미는 아니다. 관찰하지 못한 예외 상황이나 숨겨진 동작이 존재할 수도 있다. 그러나 적어도 관찰 가능한 범위에서는 성공과 실패를 판단할 수 있다.

반대로 신규 서비스를 개발할 때는 어떤가?

  • "이 가계부 앱은 사용자 경험이 좋은가?"
  • "이 설계는 앞으로 3년 동안 유지보수하기 좋은가?"
  • "사용자가 정말 필요로 하는 기능인가?"

이러한 질문들은 단순히 테스트를 실행한다고 정답이 나오는 문제가 아니다. 비즈니스 목표, 사용자 경험, 운영 환경, 미래의 요구사항까지 고려해야 한다. 그렇기 때문에 AI가 스스로 결과물을 평가하기 어렵다.

여기서 한 가지 결론을 얻을 수 있다. AI의 성능만큼 중요한 것은 AI가 자신의 결과물을 검증할 수 있는 환경이 갖춰져 있는가 하는 점이다.