0Pricing
Ethical Hacking Academy · 강의

EIP 제어하기

반환 주소 덮어쓰기

EIP 제어하기은(는) CoddyKit의 무료 Ethical Hacking Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Ethical Hacking Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Ethical Hacking Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

목표

오프셋을 알고 있으므로 EIP에 임의의 4바이트를 넣을 수 있습니다. 이제 문제는 그곳에 어떤 주소를 넣어야 하는가입니다.

EIP가 셸코드를 가리키도록 해야 합니다. 하지만 스택 주소를 하드코딩할 수는 없으므로 신뢰할 수 있는 점프가 필요합니다.

스택 주소를 하드코딩하면 안 되는 이유

셸코드가 있는 스택 주소는 실행할 때마다, 시스템마다 달라질 수 있습니다. 환경이 조금만 바뀌어도 주소가 이동합니다.

대신 메모리에 이미 존재하며 ESP가 현재 가리키는 위치로 실행을 리디렉션하는 안정적인 명령어를 사용합니다.

JMP ESP 기법

충돌 시 ESP가 셸코드를 가리킨다면 EIP를 JMP ESP 명령어의 주소로 설정할 수 있습니다. EIP가 해당 주소를 읽으면 CPU는 jmp esp를 실행하여 셸코드로 이동합니다.

이 간접 참조 덕분에 정확한 스택 주소와 관계없이 익스플로잇을 안정적으로 수행할 수 있습니다.

jmp esp   ; opcode FF E4

JMP ESP 찾기

로드된 모듈에서(가능하면 ASLR이 적용되지 않은 모듈에서) opcode 바이트 FF E4를 검색합니다. 모듈의 기준 주소는 일정하게 유지되므로 이 가젯을 신뢰할 수 있습니다.

mona.py 같은 도구는 적합한 명령어를 자동으로 찾아 줍니다.

!mona jmp -r esp -cpb "\x00"

잘못된 문자 피하기

일부 바이트 값은 입력이 버퍼에 온전히 도달하기 전에 입력을 망가뜨립니다. 대표적인 값은 널 바이트 0x00이며, C 문자열을 종료시킵니다. 그 밖에 0x0a(줄 바꿈)와 0x0d(캐리지 리턴)도 있습니다.

JMP ESP 주소에는 이러한 잘못된 문자가 포함되어서는 안 됩니다.

잘못된 문자 식별

어떤 바이트가 잘못되었는지 찾으려면 0x00부터 0xff까지 모든 바이트 값을 버퍼에 보내고 디버거에서 메모리를 검사합니다. 변형되거나 사라진 바이트가 잘못된 문자입니다.

이 문자들은 반환 주소와 셸코드 양쪽에서 제외해야 합니다.

!mona bytearray -cpb "\x00"

EIP 덮어쓰기 구성

이제 입력을 구성합니다. 오프셋까지 패딩을 넣은 다음 리틀 엔디언 순서로 JMP ESP 주소를 넣습니다.

JMP ESP가 0x625011AF에 있다면 기록되는 바이트는 역순이 됩니다.

buf = "A"*offset + "\xaf\x11\x50\x62"  # 0x625011AF, little-endian

점프 검증

디버거에서 JMP ESP 주소에 중단점을 설정하고 익스플로잇을 실행합니다. EIP가 해당 주소에 도달한 뒤 ESP로 이동하면 신뢰할 수 있는 리디렉션이 확인된 것입니다.

이 시점에서 EIP는 셸코드가 들어갈 위치를 가리킵니다.

셸코드 공간 마련

반환 주소 뒤에 남은 버퍼(E SP가 가리키는 위치)에 셸코드가 들어갑니다. 공간이 부족하면 짧은 점프를 사용하거나 위치를 옮겨야 할 수 있습니다.

셸코드 앞에 NOP 슬레드(0x90 무연산 바이트가 연속된 영역)를 넣으면 점프가 슬레드의 어느 위치에 도착해도 되므로 여유가 생깁니다.

buf = "A"*offset + ret + "\x90"*16 + shellcode

전체 구성

이제 전체 익스플로잇 구조가 분명해졌습니다.

  • 오프셋까지의 패딩
  • JMP ESP 주소(잘못된 문자 없음, 리틀 엔디언)
  • NOP 슬레드
  • 셸코드

셸을 실행하기까지 이제 한 단계 남았습니다.

JMP ESP의 대안

JMP ESP는 대표적인 리디렉션 방법이지만 유일한 방법은 아닙니다. 다른 레지스터가 버퍼를 가리킨다면 jmp eax, call esp, push esp; ret 가젯을 사용할 수 있습니다.

원리는 같습니다. 셸코드가 있는 위치로 제어를 전달하는 안정적인 명령어를 찾는 것입니다.

빠른 확인

JMP ESP가 하드코딩한 스택 주소보다 선호되는 이유를 떠올려 보세요.

복습

이제 실행 흐름을 제어할 수 있습니다.

  • 불안정한 스택 주소 대신 JMP ESP 가젯의 주소로 EIP를 덮어씁니다.
  • ASLR이 적용되지 않은 모듈에서 가젯을 찾고 0x00 같은 잘못된 문자는 피합니다.
  • 주소를 리틀 엔디언으로 기록하고 셸코드 앞에 NOP 슬레드를 추가합니다.

다음에는 셸코드를 생성하고 셸을 실행합니다.

자주 묻는 질문

“EIP 제어하기” 강의는 무료인가요?

네 — “EIP 제어하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Ethical Hacking Academy 강의 전체를 잠금 해제할 수 있습니다. Ethical Hacking Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“EIP 제어하기”에서 뭘 배우나요?

반환 주소 덮어쓰기 브라우저에서 직접 실행하는 실습 코드로 Ethical Hacking Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Ethical Hacking Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Ethical Hacking Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“EIP 제어하기” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Ethical Hacking Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Ethical Hacking Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 메모리와 스택
  2. 충돌을 찾는 퍼징
  3. EIP 제어하기
  4. 셸코드와 익스플로잇
← Ethical Hacking Academy(으)로 돌아가기