맨위로가기

역어셈블러

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

역어셈블러는 기계어 코드를 어셈블리어로 변환하는 도구이다. 역어셈블 과정은 기계어 코드 분석, 명령어 디코딩, 니모닉 생성, 주소 및 레이블 처리 등의 단계를 거친다. 하지만 정보 손실, 코드와 데이터 구분, 가변 길이 명령어, 동적 점프, 자기 수정 코드, 난독화 및 암호화 등으로 인해 역어셈블 과정은 어려움을 겪는다. 역어셈블러는 리버스 엔지니어링, 보안 취약점 분석, 디버깅, 교육 및 연구 등 다양한 분야에서 활용되며, 독립형, 대화형, 디버거 통합형 등 여러 유형의 도구가 존재한다.

더 읽어볼만한 페이지

  • 역공학 - 역컴파일러
    역컴파일러는 기계어 또는 중간 언어 코드를 분석하여 고수준 언어 코드로 재구성하는 도구로, 로더를 통한 분석, 디스어셈블리, 프로그램 분석, 데이터 흐름 분석, 타입 분석, 구조화 단계를 거쳐 고수준 언어 코드를 생성하며, 소프트웨어 상호 운용성을 위해 제한적으로 허용되지만 저작권 침해의 소지가 있다.
  • 역어셈블러 - OllyDbg
    OllyDbg는 32비트 디버거로, 리버스 엔지니어링, 소프트웨어 크래킹, 어셈블리 코드 편집, 프로그램 동작 확인, 악성코드 분석 등에 활용되며, 디스어셈블러 부분은 GNU GPL에 따라 자유 소프트웨어로 배포된다.
  • 역어셈블러 - 인터랙티브 디스어셈블러
    인터랙티브 디스어셈블러는 다양한 시스템, 프로세서, 컴파일러를 지원하는 디스어셈블 및 디버깅 도구로, IDC 스크립트를 통한 기능 확장과 다양한 스크립트 언어 및 디버깅 환경을 지원한다.
  • 프로그래밍 도구 - SWIG
    SWIG는 C/C++ 코드를 다른 프로그래밍 언어에서 사용할 수 있도록 인터페이스를 자동으로 생성해주는 도구로서, 복잡한 데이터 형식 처리, 메모리 관리 등을 지원하며, LLDB, GNU Radio, TensorFlow 등 다양한 프로젝트에서 활용된다.
  • 프로그래밍 도구 - 소스 코드 편집기
    소스 코드 편집기는 구문 강조, 자동 완성, 들여쓰기 등의 기능으로 코드 편집을 용이하게 하고 개발 도구 실행 환경을 제공하며, 텍스트 편집 대신 AST를 조작하는 구조 편집기도 존재한다.
역어셈블러

2. 역어셈블리의 원리 및 과정

컴퓨터가 직접 실행하는 프로그램은 숫자로 이루어진 기계어인데, 이는 사람이 직접 이해하기 어렵다. 이 기계어는 사람이 이해하기 쉬운 소스 코드를 어셈블러나 컴파일러, 링커 같은 도구를 이용해 변환한 결과물이다. 따라서 프로그래머는 일반적으로 소스 코드를 보며 소프트웨어를 개발한다.

하지만 원본 소스 코드를 구할 수 없고 기계어만 있는 경우, 기계어를 다시 사람이 이해할 수 있는 형태로 되돌리는 과정이 필요하다. 이것이 바로 역어셈블리이며, 기계어 코드를 각 명령어에 해당하는 어셈블리어 니모닉(mnemonic)으로 변환하는 과정을 통해 소스 코드를 어느 정도 복원하거나 분석할 수 있게 돕는다. 즉, 어셈블리의 반대 과정을 수행하는 것이다.

2. 1. 명령어 디코딩

온라인 역어셈블 사이트[12][13]를 이용하면, 특정 기계어 코드를 개별 CPU의 명령으로 간주하여 역어셈블을 시도해 볼 수 있다. 동일한 기계어 코드라도 대상 CPU 아키텍처에 따라 전혀 다른 명령어나 데이터로 해석될 수 있다.

예를 들어, 몇 가지 기계어 코드가 다른 CPU 아키텍처에서 어떻게 디코딩되는지는 다음과 같다.

CPU 아키텍처별 기계어 코드 디코딩 예시
기계어 코드CPU 아키텍처역어셈블 결과
00Z80nop
00VAXhalt
00i8086데이터 (명령으로 간주되지 않음)
00 00AVRnop
00 00V850nop
00 00ARMmovs r0, r0
00 00i8086add %al,(%bx,%si)
00 00i386add BYTE PTR [eax], al
00 00MIPS16addiu s0,sp,0
00 00 00 00MIPSnop
00 00 00 00MC68000orib #0,%d0
00 00 00 00Alphahalt


3. 역어셈블리의 어려움

역어셈블 과정은 여러 요인으로 인해 원본 소스 코드를 완벽하게 복원하기 어려운 경우가 많다. 컴파일 및 어셈블 과정에서 많은 정보가 손실되고, 동일한 기계어 코드를 생성하는 다양한 어셈블리어 표현이 존재할 수 있어 원본 코드를 특정하기 어렵다.

또한, 바이너리 내에서 실행 가능한 코드와 데이터를 명확히 구분하기 어려울 수 있으며(ELF, PE 형식 등은 구분을 돕지만 항상 가능한 것은 아니다), 가변 길이 명령어를 사용하는 아키텍처(CISC 등)에서는 여러 해석 가능성이 존재한다. CPU가 런타임에 계산된 주소로 점프하는 동적 점프나, 실행 중 코드가 스스로 변경되는 자기 수정 코드 역시 정적 분석만으로는 완전히 파악하기 힘들다.

마지막으로, 역공학이나 크래킹을 방지하기 위해 적용되는 암호화, 패킹, 코드 난독화 등의 기술(디지털 권한 관리 등)은 역어셈블 분석을 더욱 어렵게 만든다. 이러한 기술이 적용된 코드는 분석 전에 해독이나 압축 해제 등의 전처리 과정이 필요하다.

3. 1. 정보 손실

컴파일 과정에서 소스 코드에 있던 변수명, 자료형, 주석 등 사람이 이해하기 쉬운 정보들이 상당 부분 사라진다. 이 때문에 기계어어셈블리어로 변환된 코드를 다시 역어셈블하더라도 원래 소스 코드만큼 내용을 파악하기 어렵다.

어셈블된 바이너리 코드와 정확히 동일한 바이너리 코드를 생성하는 역어셈블러를 만드는 것은 가능하지만, 이 과정에서 원본 어셈블리어 코드와 차이가 발생할 수 있다. 이는 어셈블러가 특정 기계어 명령을 표현하는 방식에 여러 선택지가 있을 수 있기 때문이다. 예를 들어, x86 아키텍처에서 `MOV AX, BX`와 같은 간단한 명령어도 여러 가지 바이너리 코드로 표현될 수 있는데, 어셈블러는 그중 하나를 임의로 선택한다. 역어셈블러는 원본 코드 작성 시 어떤 바이너리 표현이 사용되었는지 정확히 알 수 없으므로, 원본 어셈블리 코드를 완벽하게 복원하지 못할 수 있다.

또한, 역어셈블된 코드를 수정할 때도 정보 부족으로 인한 문제가 발생한다. 예를 들어, 특정 위치로 이동하는 기계어 점프문이 있다고 가정해보자. 역어셈블러는 이 점프 명령을 해석하여 어셈블리 코드로 보여주지만, 이 점프가 원래 상대 주소를 사용했는지 절대 주소를 사용했는지 구분하지 못할 수 있다. 역어셈블러는 일단 원본 바이너리를 다시 만들 수 있는 형태로 코드를 생성하지만, 만약 프로그래머가 점프문 주변 코드를 수정하여 점프 거리가 변경될 경우, 점프 방식을 직접 파악하고 수정해야 하는 어려움이 따른다. 이러한 이유로 역어셈블 과정에서는 원본 코드의 구조나 세부적인 구현 방식에 대한 정보가 일부 손실될 수 있다.

3. 2. 코드와 데이터 구분

이진 파일 안에서 실행 가능한 코드와 데이터를 항상 명확하게 구분하기는 어렵다. ELF나 PE와 같은 일반적인 실행 파일 형식은 코드와 데이터를 별도의 섹션으로 나누어 관리하지만, 플랫 바이너리(flat binary) 형식은 그렇지 않다. 이 때문에 특정 위치의 내용이 실행 가능한 명령어인지, 아니면 실행 불가능한 데이터인지 불분명해지는 경우가 발생한다. 이러한 모호함은 역어셈블 과정을 더 복잡하게 만드는 요인이 된다.

3. 3. 가변 길이 명령어

가변 길이 명령어를 사용하는 컴퓨터 아키텍처, 특히 많은 CISC 아키텍처에서는 동일한 바이너리 코드에 대해 두 가지 이상의 유효한 디스어셈블 결과가 존재할 수 있다. 이는 역어셈블 과정에서 정확한 명령어 경계를 파악하기 어렵게 만드는 요인이 된다.

3. 4. 동적 점프

CPU는 종종 런타임에 계산된 동적 점프를 허용하므로, 실행될 수 있는 바이너리 내의 모든 가능한 위치를 식별하는 것이 불가능하게 한다.

3. 5. 자기 수정 코드

역어셈블러는 실행 중에 코드가 스스로 변경되는 경우 이를 제대로 처리하기 어렵다. 왜냐하면 정적 분석 방식으로는 프로그램이 실행되는 도중(런타임)에 발생하는 코드 변경 사항을 미리 예측하거나 파악할 수 없기 때문이다.

3. 6. 난독화 및 암호화

암호화, 패킹, 또는 코드 난독화와 같은 기술은 컴퓨터 프로그램에 자주 적용된다. 특히 디지털 권한 관리(DRM)의 일부로서 역공학(리버스 엔지니어링) 및 크래킹을 방지하려는 목적으로 사용된다. 이러한 기술들은 역어셈블 과정을 더욱 복잡하게 만드는데, 의미 있는 분석을 시작하기 전에 코드를 먼저 압축 해제(언패킹)하거나 해독해야 하기 때문이다.

4. 역어셈블리의 활용

컴퓨터가 직접 실행하는 프로그램은 숫자로 이루어진 기계어이며, 이는 사람이 직접 이해하기 어렵다. 기계어는 사람이 이해하기 쉬운 소스 코드를 어셈블러나 컴파일러, 링커 등의 도구를 이용해 변환한 결과물이다. 따라서 프로그래머는 일반적으로 소스 코드를 통해 소프트웨어를 개발하고 이해한다. 하지만 원본 소스 코드를 구할 수 없는 기계어 상태의 프로그램만 있다면, 역어셈블리 과정을 통해 원래의 소스 코드를 추정하고 복원하는 데 활용될 수 있다.

4. 1. 리버스 엔지니어링

소스 코드를 분실했거나 기타 이유로 확보할 수 없는 프로그램의 동작 방식을 알아내야 할 때 역어셈블러가 사용된다. 프로그램의 기계어는 사람이 직접 이해하기 어렵기 때문에, 역어셈블러를 통해 기계어를 사람이 이해하기 더 쉬운 어셈블리어 니모닉으로 변환하여 분석을 용이하게 한다.

물론 '이해하기 쉽다'는 것은 기계어와 비교했을 때의 이야기이다. 역어셈블된 결과를 분석하여 프로그램의 내부 동작을 파악하고 원래의 소스 코드를 추정하는 과정은 일종의 암호 해독처럼 매우 어려운 작업이다. 고도의 기술을 가진 전문가가 상당한 시간과 노력을 투입해야만 성공할 수 있다.

프로그램의 동작 방식이 분석되면 여러 이해관계가 복잡하게 얽힐 수 있으므로, 상용 소프트웨어의 라이선스나 계약에서는 역어셈블을 포함한 리버스 엔지니어링 행위를 금지하는 조항을 명시하는 경우가 많다.

하지만 소프트웨어 특허 침해를 입증하기 위해 역어셈블을 하는 경우에는 이러한 계약상의 금지 조항이 적용되지 않을 수 있다. 참고로, 라이선스나 계약으로 리버스 엔지니어링을 금지하는 법적 효력에 대해서는 일본의 경우 2008년 당시 문화청에서 검토 중이었다.[9]

4. 2. 디버깅

고급 언어로 작성된 소프트웨어를 디버깅할 때 역어셈블러를 사용하기도 한다. 이를 위해 독립적인 역어셈블러를 이용하거나, 디버거 기능의 일부로 제공되는 "혼합 모드"(Mix 모드)를 활용하는 경우가 많다. 혼합 모드는 소스 코드와 기계어, 그리고 역어셈블 결과를 함께 보여준다.

고급 언어 코드는 컴파일러를 통해 기계어로 변환되어 실행 파일이 만들어진다. 하지만 때때로 프로그래머가 작성한 고급 언어 코드와 컴파일러가 생성한 기계어 코드가 정확히 일치하지 않을 수 있다. 또한, 컴파일러 자체에 버그가 있어 잘못된 코드를 생성하는 경우도 있다[10]. 이런 상황에서는 컴파일 전의 소스 코드만으로는 버그의 원인을 찾기 어려워, 실제 실행되는 기계어 코드를 직접 검증해야 할 필요가 생긴다. 그러나 기계어는 사람이 직접 이해하기 어렵기 때문에, 디버거는 기계어를 그와 일대일로 대응하는 니모닉으로 변환하여 보여주는 역어셈블 기능을 제공한다.

만약 실행 파일에 디버깅 심볼 정보가 포함되어 있다면, 디버거는 역어셈블 결과와 함께 원본 소스 코드도 표시할 수 있어[11] 프로그래머가 코드의 의미를 파악하기 더 쉬워진다. 개발 중인 소프트웨어에는 보통 디버깅 심볼 정보가 포함되지만, 이 정보는 파일 크기가 매우 크고 리버스 엔지니어링에 유용한 정보를 담고 있을 수 있어, 시장에 출시하는 소프트웨어에서는 일반적으로 제거한다. 제거된 디버깅 심볼 정보를 따로 보관하는 경우는 드물기 때문에, 최종 사용자 환경에서 발생한 버그를 역어셈블을 통해 분석하는 것은 때때로 다른 사람이 개발한 소프트웨어를 리버스 엔지니어링하는 것과 비슷한 어려움을 겪게 된다.

5. 역어셈블러 도구

역어셈블러는 작동 방식과 기능에 따라 다양한 종류로 나눌 수 있다. 크게 사용자와의 상호작용 여부에 따라 독립형 역어셈블러와 대화형 역어셈블러로 구분된다. 독립형 역어셈블러는 실행 시 분석 대상 프로그램의 어셈블리어 코드를 생성하는 반면, 대화형 역어셈블러는 사용자의 입력에 따라 실시간으로 분석 결과를 보여주며 상호작용한다.

또한, 많은 디버거는 프로그램 분석을 돕기 위해 기본적인 역어셈블 기능을 내장하고 있다. 때로는 특정 역어셈블러 도구가 디버거와 함께 제공되거나, 독립적인 프로그램으로도 배포되기도 한다. 예를 들어, GNU 바이너리 유틸리티에 포함된 objdump는 gdb와 관련된 역어셈블 기능을 제공한다.[2] 이 외에도 특정 목적에 특화된 역어셈블러 도구들이 존재한다.

5. 1. 독립형 역어셈블러

독립형 역어셈블러는 실행 시 분석 대상 프로그램의 어셈블리어 코드를 담은 파일을 생성하며, 사용자는 이 생성된 파일을 검사할 수 있다. 이는 사용자의 입력에 따라 실시간으로 분석 결과를 변경하여 보여주는 대화형 역어셈블러와 구분된다. 대화형 방식에서는 예를 들어, 처음에는 데이터로 간주되었던 프로그램 영역을 사용자가 코드로 지정하면, 즉시 해당 부분의 역어셈블된 코드가 화면에 표시되어 동일한 작업 세션 내에서 분석과 추가적인 변경이 가능하다.

많은 대화형 디버거는 디버깅 중인 프로그램의 기본적인 역어셈블 결과를 보여주는 기능을 포함하고 있다. 때로는 동일한 역어셈블러 도구가 디버거와 함께 제공되면서, 독립적인 실행 파일 형태로도 배포되기도 한다. 예를 들어, GNU 바이너리 유틸리티에 포함된 objdump는 대화형 디버거인 gdb와 관련이 있다.[2]

다음은 대표적인 독립형 역어셈블러 또는 관련 도구들의 예시이다.

  • Binary Ninja[1]
  • DEBUG
  • Ghidra
  • Hiew
  • Hopper Disassembler[2]
  • IBM OLIVER (CICS 대화형 테스트/디버그): 어셈블리어, COBOL, PL/1용 역어셈블러 포함
  • Interactive Disassembler (IDA)
  • Netwide Disassembler (Ndisasm): Netwide Assembler (NASM)의 일부
  • OllyDbg: 32비트 어셈블리어 수준 분석 디버거
  • PE Explorer Disassembler[3]
  • Radare2
  • Rizin[4] 및 Cutter[5] (Rizin용 그래픽 인터페이스)
  • SIMON (배치 대화형 테스트/디버그): 어셈블리어, COBOL, PL/1용 역어셈블러 포함
  • Sourcer: 1990년대 V Communications에서 제작한 DOS, OS/2, Windows용 주석 처리 16비트/32비트 역어셈블러
  • x64dbg: 동적 역어셈블리를 수행하는 Windows용 디버거

5. 2. 대화형 역어셈블러

대화형 역어셈블러는 사용자와 상호작용하며 실시간으로 코드 분석 결과를 보여주는 도구이다. 독립형 역어셈블러가 실행 시 분석된 어셈블리어 파일을 생성하는 것과 달리, 대화형 역어셈블러는 사용자가 분석 과정에서 내리는 판단이나 변경 사항을 즉시 반영한다. 예를 들어, 프로그램의 특정 영역이 처음에는 데이터로 잘못 인식되었더라도 사용자가 이를 코드로 지정하면, 역어셈블된 코드 내용이 즉각적으로 화면에 업데이트된다. 이를 통해 사용자는 한 번의 실행으로 더 많은 검사와 분석을 효율적으로 수행할 수 있다.

대부분의 상호작용형 디버거는 디버깅 중인 프로그램의 코드를 역어셈블하여 보여주는 기능을 기본적으로 포함하고 있다. 때로는 동일한 역어셈블리 도구가 디버거와 함께 독립형 역어셈블러로 배포되기도 한다. 대표적인 예로 GNU 바이너리 유틸리티에 포함된 objdump는 GNU 디버거(gdb)와 연관되어 있다.[2]

다음은 대화형 역어셈블러 또는 관련 기능을 포함한 도구들의 예시이다.

  • Binary Ninja[1]
  • DEBUG
  • Ghidra
  • Hiew
  • Hopper Disassembler[2]
  • IBM OLIVER (CICS 대화형 테스트/디버그): 어셈블리어, COBOL, PL/1용 역어셈블러 포함
  • IBM SIMON (배치 대화형 테스트/디버그): 어셈블리어, COBOL, PL/1용 역어셈블러 포함
  • IDA Pro
  • Netwide Disassembler (Ndisasm): Netwide Assembler(NASM)의 컴패니언 도구
  • OllyDbg: 32비트 어셈블리어 수준 분석 디버거
  • PE Explorer Disassembler[3]
  • Radare2
  • Rizin[4] 및 Cutter[5] (Rizin용 그래픽 인터페이스)
  • Sourcer: 1990년대 V Communications에서 제작한 DOS, OS/2, Windows용 주석 처리 16비트/32비트 역어셈블러
  • x64dbg: 동적 역어셈블리를 수행하는 Windows용 디버거

5. 3. 디버거 통합형 역어셈블러

대부분의 상호적인 디버거는 디버깅 중인 프로그램의 기본적인 역어셈블리 기능을 포함하며, 이를 통해 사용자는 프로그램 실행 중에 코드를 실시간으로 확인하고 분석할 수 있다.

종종 동일한 역어셈블리 도구가 디버거와 함께 독립적인 역어셈블러로 배포되기도 한다. 예를 들어, GNU 바이너리 유틸리티의 일부인 objdump는 GNU 디버거(gdb)와 관련이 있다.[2]

다음은 디버거에 통합되거나 관련 기능을 제공하는 역어셈블러 및 도구들의 목록이다.

  • Binary Ninja[1]
  • DEBUG
  • Ghidra
  • Hiew
  • Hopper Disassembler[2]
  • IBM OLIVER (CICS 대화형 테스트/디버그): 어셈블러, COBOL, PL/1용 역어셈블러 포함.
  • IBM SIMON (배치 대화형 테스트/디버그): 어셈블러, COBOL, PL/1용 역어셈블러 포함.
  • Interactive Disassembler (IDA)
  • Netwide Disassembler (Ndisasm): Netwide Assembler (NASM)의 컴패니언.
  • OllyDbg: 32비트 어셈블러 수준 분석 디버거.
  • PE Explorer Disassembler[3]
  • Radare2
  • Rizin[4] 및 Cutter[5] (Rizin용 그래픽 인터페이스)
  • Sourcer: 1990년대 V Communications에서 제작한 DOS, OS/2, Windows용 주석 처리 16비트/32비트 역어셈블러.
  • x64dbg: 동적 역어셈블리를 수행하는 Windows용 디버거.

5. 4. 길이 역어셈블러 (LDE)

'''길이 디스어셈블러'''는 '''길이 디스어셈블러 엔진'''('''LDE''')이라고도 하며, 일련의 바이트(명령어)가 주어지면 파싱된 명령어가 차지하는 바이트 수를 출력하는 도구이다.[6] 주로 x86 아키텍처에서 사용되며, 이 아키텍처를 위한 주목할 만한 오픈 소스 프로젝트로는 ldisasm,[6] Tiny x86 Length Disassembler[7] 및 Extended Length Disassembler Engine for x86-64[8] 등이 있다.

6. 역어셈블리와 에뮬레이터

동적인 역어셈블러는 에뮬레이터하이퍼바이저의 결과물에 통합될 수 있다. 이렇게 통합된 동적 역어셈블러는 기계 명령어의 실시간 실행 과정을 추적하고, 이를 한 줄씩 표시하는 기능을 제공한다. 이 과정에서 역어셈블된 기계 코드와 함께, 각 명령어가 실행될 때마다 레지스터, 데이터, 또는 기타 상태 요소(예: 조건 코드)에 어떤 변화가 생겼는지 함께 보여줄 수 있다.

이러한 기능은 프로그램의 문제를 해결하는 데 매우 강력한 디버깅 정보를 제공한다. 하지만 프로그램 실행 전체 과정을 추적할 경우, 생성되는 출력의 양이 매우 커질 수 있다는 단점이 있다.

이러한 동적 역어셈블 기능은 1970년대 초에 IBMCICS 디버깅 제품의 일부였던 OLIVER 시스템에서 처음 도입되었으며, 현재는 Compuware 사의 XPEDITER 제품 등에 통합되어 활용되고 있다.

7. 역어셈블리와 법적 문제

역어셈블리는 소프트웨어의 저작권 침해나 영업 비밀 침해와 같은 법적인 문제를 일으킬 수 있다.[9] 이러한 법적 쟁점은 소프트웨어 개발자와 사용자 모두에게 중요한 고려 사항이 된다.

7. 1. 저작권 침해

상용 소프트웨어의 라이선스나 계약에는 프로그램의 동작을 해석하여 이해관계를 해칠 수 있다는 우려 때문에, 리버스 엔지니어링의 일종인 역어셈블을 금지하는 문구가 포함되는 경우가 많다.

그러나 소프트웨어 특허의 침해를 입증하기 위해 행해지는 역어셈블에 대해서는, 이를 금지하는 계약의 효력이 미치지 않을 수 있다. 참고로, 라이선스나 계약으로 리버스 엔지니어링을 금지하는 법리에 대해 일본에서는 2008년 시점에서 문화청에서도 검토 중이었다.[9]

참조

[1] 웹사이트 Binary Ninja https://binary.ninja[...] 2022-01-25
[2] 웹사이트 Hopper https://www.hopperap[...] 2022-01-25
[3] 웹사이트 PEExplorer Windows Disassembler for Win 32-bit Program EXE DLL OCX, Code Binary Analysis Tool http://www.heaventoo[...] 2022-04-25
[4] 웹사이트 Rizin https://rizin.re/ 2023-12-09
[5] 웹사이트 Cutter https://cutter.re/ 2023-12-09
[6] 웹사이트 ldisasm https://github.com/n[...] 2020-02-26
[7] 웹사이트 Tiny x86 Length Disassembler https://github.com/g[...] 2019-12-10
[8] 웹사이트 Extended Length Disassembler Engine for x86-64 https://github.com/G[...] 2019-12-10
[9] 웹사이트 리버스・엔지니어링에 관련된 법적 과제에 대한 논점 https://www.bunka.go[...] 2022-10-04
[10] 문서
[11] 문서
[12] 웹사이트 Online Disassembler https://onlinedisass[...] 2021-01-13
[13] 웹사이트 Online Assembler and Disassembler https://shell-storm.[...] 2024-05-17



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com