피드로 돌아가기
Dev.toSecurity
원문 읽기
x64 Assembly 최적화 및 Shellcode 설계를 위한 저수준 메모리 제어 기법
x64 Windows Assembly Fundamentals Part 2: Learning the Language
AI 요약
Context
고수준 언어의 추상화 계층 아래에서 동작하는 x64 Windows calling convention과 CPU 레지스터 제어 메커니즘 분석. 메모리 주소 직접 참조와 스택 프레임 관리의 불일치로 인한 런타임 크래시 위험 존재.
Technical Solution
- Memory Dereferencing: Square brackets를 활용한 포인터 역참조와 LEA 명령어를 통한 주소 값 직접 로드 구분 설계
- Stack Frame Management: RSP 레지스터 기반의 하향 성장 구조에서 Push/Pop을 통한 8바이트 단위 메모리 할당 및 해제 제어
- Instruction Optimization: NULL 바이트 제거를 통한 Shellcode 안정성 확보를 위해 mov 0 대신 xor reg, reg 패턴 적용
- Branching Logic: Arithmetic 연산 결과가 반영된 FLAGS 레지스터의 ZF/SF/CF/OF 비트를 기반으로 Conditional Jump 구현
- Register Volatility Control: 함수 호출 간 데이터 보존을 위해 Non-volatile 레지스터(R12 등)를 루프 카운터로 활용하는 설계
실천 포인트
- Shellcode 작성 시 NULL 바이트로 인한 문자열 종료 방지를 위해 xor 연산 활용 여부 검토 - 함수 호출 전 Shadow Space(40 bytes) 할당 및 스택 정렬 상태 확인 - 호출된 함수 내에서 보존되어야 할 데이터는 Non-volatile 레지스터에 할당했는지 검증 - Memory-to-Memory 직접 이동 불가 제약을 고려하여 레지스터를 경유하는 데이터 전송 경로 설계