본문 바로가기

[기술리뷰]

[2025.09.18] Team Atlanta의 Context Engineering

https://team-atlanta.github.io/blog/post-context-engineering/

 

Context Engineering: How BGA Teaches LLMs to Write Exploits

Deep dive into the context engineering techniques that make BGA's AI agents effective at vulnerability exploitation - from XML structuring to coverage feedback loops

team-atlanta.github.io


그저 ai를 활용하는 작업에서는 충분하지만 해킹 같은 익스플로잇 작업에서는 LLM의 추측 능력만으로는 부족하고, 정확성을 확보할 수 있도록 컨텍스트를 체계적으로 주입해야 한다. 정보를 그냥 주는 게 아니라, 구조화된 방식으로 어디를, 왜, 어떻게 해야하는지 맥락을 설계해야 한다.


네 가지 근본 원칙

 

1.  Top-Down Guidance

큰 그림부터 → 세부적인 지시

2. Structure & Clarity

무작정 문장으로 주는 것보다 xml / json / 섹션 구조로 나누는 게 효과적임.

3. Concise Yet Comprehensive

너무 짧게 주면 정보가 부족하고, 너무 길게 주면 산만해져서 지시를 놓친다. 정확히 필요한 만큼만 주는 게 좋음.

4. Avoid Overcomplication

프롬프트가 꼬여 있으면 모델도 헷갈릴 수 있다. 단순하고 반복 가능한 패턴이 안정적으로 성능을 보장할 수 있음

 

llm을 마법 상자로 보면 안됨. 잘 구조화된 정보를 필요로 하는 지적 파트너로 대해야 함. 


네 가지 핵심 기법

중요한 사실은 단순한 프롬프트만으로는 복잡한 취약점 익스플로잇을 다룰 수 없다는 것임.

 

1. XML-Structured Context Design

문장 지시 말고, 태그 구조 써서 안정적 파싱

2. Source Code Annotation Systems

코드 스니펫에 [123]: line code // @BUG_HERE 같은 표식을 붙여줌으로써 어디를 수정/공격해야 하는지 정확히 포착 가능

3. Coverage-Driven Iterative Refinement

실행 결과의 실패, 성공 결과를 제공해서 원인 분석하게 함. 이렇게 루프 돌리면서 점진적으로 정확도를 높임

4, Domain Knowledge Integration

모든 지식을 주입하는 게 아니라 해당 취약점과 관련된 최소한의 전문 지식만 주입해야 함. 불필요한 지식을 배제해 모델이 혼란받지 않게 함. 위 네 가지의 기법은 하나의 유기적 시스템으로 묶여 함께 작동할 수 있음.


Technique 1: XML-Structured Context Design

Implements : Structure & Clarity

 

왜 XML이 기술적 컨텍스트에 효과적인가

계층적 구조, 복잡성보다 맥락 우선, 명확한 주석, 체계적인 조직을 강조

 

Top-Down Guidance

[ 시스템 프롬프트 → 소스 코드 → 서브 태스크 → 커버리지 피드백 → 분석 ]

이 순서를 지키면 모델이 왜 이 작업을 하는지 → 어떻게 해야 하는지 → 어디를 수정해야 하는지를 단계적으로 이해함.


Technique 2: Source Code Annotation Systems

Implements : Concise Yet Comprehensive

 

The [n]: Line Number Format

줄마다 [n]: 를 붙여줌으로써 코드 줄 번호와 코드 내용을 구분하기 위함.

이렇게 하면 LLM이 수정·참조할 때 줄 번호 기준으로 정확히 가리킬 수 있음.

 

The @ Annotation System

@BUG_HERE: 실제 취약 코드가 있는 지점

@KEY_CONDITION: 도달 조건이 되는 분기/조건문

@VISITED: 실행/테스트 단계에서 실제 도달했음을 표시

코드 흐름에서 어디가 중요하고, 왜 중요한지, 실행 중 충족되었는 지까지 모두 알 수 있음.

 

핵심은 코드에 줄번호 + 특수 주석을 붙여 LLM이 길을 잃지 않게 만드는 것


Technique 3: Coverage-Driven Iterative Refinement

 

The @VISITED Breakthrough

실제 실행 커버리지에서 어떤 조건이 충족됐는지 @VISITED 마커 표시

모델이 코드를 실행할 때 실제로 무슨 일이 일어나는 지 실시간 피드백을 받는 것과 같음.

 

Systematic Iterative Refinement

차이 분석 → 조건 식별 → 수정 → 재시도를 반복하며 사람의 디버깅 프로세스를 흉내냄.

 

Multi-Variation Coverage Analysis

한 번만 돌리지 않고, 여러 변형을 실행해서 커버리지 데이터를 합침으로써 비결정성을 탐색 다양성으로 승화가 가능해짐.

 

결론적으로는 @VISITED 표시하고, 반복 루프 타고, 다변량 시도 병합 하면서
원래는 거의 LLM 생성이 끼워 맞추기 식의 운이었다면, 신뢰성이 있는 과정이 되게 됨.


Implementation Guide: Building Context Engineering Systems

구현 가이드 로드맵

 

1. Start with XML Structure

아래 구조는 LLM에게 무엇을 해야 하고, 어떻게 해야 하는 지를 명확히 알려줌

<role>Define the LLM's identity and mission</role>
<expertise>List relevant domain knowledge areas</expertise>
<objective>Specify exact technical requirements</objective>
<context>Ground the task in specific targets/constraints</context>
<methodology>Explain any annotation or marking systems</methodology>

 

2. Add Execution Feedback Loops

여기가 핵심이라고 함!!! 생성과 실행을 연결하는 루프를 닫아야 함.

  • Generate: LLM이 구조화된 컨텍스트 기반으로 코드 생성
  • Execute: 코드 실행 (커버리지 수집 포함)
  • Analyze: 실행 결과를 의도한 목표와 비교
  • Refine: @VISITED 마커, 실패 정보로 컨텍스트 업데이트
  • Iterate: 성공하거나 최대 반복 횟수에 도달할 때까지 반복

3. Integrate Domain Knowledge Contextually

포괄적 지식을 던지지 말고, 선별적이고 패턴 기반으로 통합해야 함

  • 코드에서 특정 패턴(Runtime.exec, consumeString 등) 스캔
  • 해당하는 도메인 지식 템플릿 로드
  • 감지된 패턴에 맞는 지식만 컨텍스트에 통합
  • 추상적 설명보다 구체적 예시를 우선 제공

→ 요약하자면 첫째 : XML 뼈대 세우기, 둘째 : 실행-피드백 루프 돌리기, 셋째 : 필요한 지식만 넣기