| Hex Opcode | Assembly Instruction | 작동 및 레지스터 설정 |
|---|
strcpy(), gets(), sprintf() 등 취약한 C 문자열 함수는 \x00을 문자열의 끝(Null Terminator)으로 인식하고 복사를 즉시 중단함. 따라서 mov $0, %eax (기계어: b8 00 00 00 00) 대신 xor %eax, %eax (기계어: 31 c0)를 사용하여 널 바이트를 완전 제거함.
공격 대상 프로세스의 스택 주소는 ASLR이나 환경 변수에 따라 계속 변할 수 있음. 따라서 하드코딩된 절대 주소를 일체 사용하지 않고, push %rbx를 통해 스택에 문자열을 직접 구성한 뒤 mov %rsp, %rdi로 현재 스택 주소를 참조하는 위치 독립적 테크닉을 구사함.
"/bin/sh"는 7바이트이므로 8바이트 정렬을 맞추기 위해 슬래시를 하나 더 붙여 "/bin//sh" (8바이트)를 만듦. 리눅스는 리틀 엔디언이므로 메모리 역순인 0x68732f2f6e69622f ("hs//nib/") 값으로 레지스터에 적재한 뒤 스택에 PUSH함.
RAX = 59 (0x3b)RDI = "/bin//sh" 포인터RSI = ["/bin//sh", NULL] 배열 포인터RDX = NULL (0)