"부당하게 이용하다"
상대 시스템에 침투하여 시스템을 악용하는 해킹
exploit 을 위해 제작된 어셈블리 코드 조각
일반적으로 셸을 획득하기 위한 목적으로 셸코드를 사용해서, 특별히 "셸" 이 접두사로 붙었다.
만약 해커가 tip 를 자신이 작성한 셸코드로 옮길 수 있으면 해커는 원하는 어셈블리 코드가 실행 되게 할 수 있다.
어셈블리어는 기계어와 거의 일대일 대응 되므로 사실상 원하는 모든 명령을 CPU 에 내릴 수 있다.
셸코드는 어셈블리어로 구성되므로 공격을 수행할 대상 아키텍처와 운영체제에 따라, 그리고 셸코드의 목적에 따라 다르게 작성된다.
공유되는 셸코드는 범용적으로 작성된 것
따라서 실행될 때의 메모리 상태 같은 시스템 환경을 완전히 반영하지는 못한다.
최적의 셸코드는 일반적으로 직접 작성해야 하며, 상황에 따라 반드시 그래야만 할 수도 있다.
셸코드를 공유하는 서비스가 있다는 사실은 알되, 언제든 스스로 작성할 수 있어야 한다.
셸코드 공유 사이트
파일을 열고, 읽은 뒤 출력해주는 셸코드!
구현하려는 셸코드의 동작을 C 언어 형식의 의사코드로 표현시
char buf[0x30];
int fd = open("/tmp/flag", RD_ONLY< NULL);
read(fd, buf, 0x30);
write(1, buf, 0x30);
syscall
시스템 호출 또는 시스템 콜(system call), 간단히 시스콜(syscall)은 운영 체제의 커널이 제공하는 서비스에 대해, 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스이다.
rax : Accumulator register
rbx : base register
rcx : counter register
rdx : data register
rsp : stack pointer register
rsp : base pointer register
rsi : source index register
rdi : Destination index register
의사코드의 각 줄을 어셈블리로 구현한다면! (아래)