.section .data msg_normal: .ascii "Normal exit.\n" msg_secret: .ascii "SUCCESS! Secret function executed!\n" .section .text .global _start # -------------------------------------------------------- # [타겟 함수] 정상적인 흐름으로는 절대 호출되지 않음 # -------------------------------------------------------- secret_function: # "SUCCESS! ..." 출력 mov $4, %eax # sys_write mov $1, %ebx # stdout mov $msg_secret, %ecx mov $35, %edx # length int $0x80 # 즉시 종료 xor %ebx, %ebx mov $1, %eax # sys_exit int $0x80 # -------------------------------------------------------- # [취약한 함수] 4바이트 버퍼에 100바이트를 들이부음 # -------------------------------------------------------- vuln_func: # 스택 프레임 확보 (겨우 4바이트) sub $4, %esp # sys_read(stdin, buffer=esp, len=100) mov $3, %eax # sys_read xor %ebx, %ebx # stdin (0) mov %esp, %ecx # buffer (현재 스택 포인터 위치) mov $100, %edx # [취약점] 4바이트 방에 100명을 초대함! int $0x80 # 스택 정리 add $4, %esp # [여기가 핵심] # 스택에서 리턴 주소(RET)를 꺼내서 점프하는데, # 위에서 오버플로우로 RET가 조작되었다면? -> 펑! ret # -------------------------------------------------------- # [메인 진입점] # -------------------------------------------------------- _start: call vuln_func # 정상 종료 메시지 출력 (익스플로잇 실패 시 여기로 옴) mov $4, %eax mov $1, %ebx mov $msg_normal, %ecx mov $13, %edx int $0x80 # 종료 xor %ebx, %ebx mov $1, %eax int $0x80