728x90
[실습] 쉘 코드의 GetPC 루틴 구현 및 디버깅 실습 (FSTENV 패턴)
쉘코드는 처음 실행될 때 자신이 로드된 가상주소를 알지 못하기 때문에 쉘코드 디코딩 과정이나 문자열 참조 과정 등이 필요할 경우 어디서부터 디코딩해야할지 어디를 참조해야 원하는 문자열을 얻을 수 있는지 알 수 없음
GetPC 루틴을 통해 현재 쉘코드가 자신의 주소 위치를 확인하고 해당 위치를 기준으로 원하는 행위를 수행함
FSTENV(FPU Stack Enviroment)
x86 아키텍처에서 사용되는 부동 소수점 관련 명령어 중 하나
x87 ControlWord, StatusWord, TagWord, FPU 프로그램 카운터 등 부동 소수점 환경과 관련된 값을 스택에 저장
Q. FSTENV 명령으로 어떻게 쉘코드가 올라간 메모리의 가상 주소값을 획득할 수 있을까요?
A.FPU 프로그램 카운터: 스택에 올라가는 값 중 프로그램 카운터와 관련된 값
쉘코드에서 FPU 명령을 실행하고 FSTENV로 FPU 프로그램 카운터를 스택에 저장
↳현재 쉘코드의 위치를 스택에 저장할 수 있음
이후 pop 명령으로 특정 레지스터에 해당 값을 저장함으로써 현재 쉘코드가 위치한 가상 주소 획득
FSTENV 패턴 이해
- 메모리를 할당하고 해당 영역에 명령을 입력합니다.

덤프 D9 EE D9 74 F4 58

fldz 명령어와 fns tenv 명령을 확인한다.

pop eax
- 시작 위치에 EIP를 설정합니다.

- FSTENV 명령 실행 시. 스택 상태를 확인합니다. (FPU 연산과 관련한 환경 값들이 스택에 저장, 현재 스택에는 마지막으로 수행된 FPU연산의 명령 포인터가 저장)

- POP EAX 실행 시 EAX에 마지막으로 수행된 부동소수점 명령의 주소를 획득할 수 있습니다.

*FSTENV 패턴의 GetPC루틴을 통해 쉘 코드가 위치한 포인터를 획득할 수 있는 것을 확인할 수 있습니다.
FSTENV 패턴 분석1
| 쉘 코드 분석 실습 | |
| 대상 파일 | analayeme-sc05.01.bin |
| MD5 | 2A76539003AA15DE7DBB6789C79443E1 |
- 실습 시작 준비
메모리 맵- 메모리 할당
메모리 공간에 analayeme-sc05.01.bin
바이너리 편집기-붙여넣기(크기 무시X)
디스어셈블러에서 따라가기
ETP 설정

- FSTENV 명령 실행 시 마지막으로 수행된 FPU 연산의 명령 포인터가 스택에 저장됩니다.

- POP EDX 실행 시 EDX에 저장되는 값을 확인합니다.

- EDX를 이용해 쉘 코드에 포함된 디코딩하고자 하는 데이터에 접근합니다.
- EAX와 XOR연산을 수행하면서 셀프 디코딩 과정을 거칩니다.

*FSTENV 패턴의 GetPC루틴을 통해 쉘 쿠드에 포함된 디코딩 과정을 거칠 영역의 주소를 획득하고 디코딩 루프를 돌면서 해당 데이터 영역을 디코딩합니다.
FSTENV 패턴 분석2
| 쉘 코드 분석 실습 | |
| 대상 파일 | mailcious-10d12a43.doc.shellcode.bin |
| MD5 | EAA9B772DDE827A11E95A8FF931D17F9 |
강의요약
- FNSTENV 명령어가 무엇인지
- FNSTENV로 어떻게 GetPC 과정을 수행하는지 쉘코드를 한 단계씩 진행해보며 확인
728x90
반응형
'cs > sec' 카테고리의 다른 글
| [모의해킹]도파민을 이용한 iOS 15.8 탈옥 후 Burp (0) | 2026.01.11 |
|---|---|
| [모의해킹]안드로이드 Galaxy S10e 루팅(Rooting) with Magisk (1) | 2026.01.11 |
| [이론] 쉘 코드 개요 (0) | 2025.12.19 |
| [인프라와 웹의 위협기술]22. LFI와 RFI 개요 (0) | 2025.12.19 |
| 웹 서비스 해킹을 위한 버프스위트 활용 가이드 (1) | 2025.12.19 |