Shellcoding
쉘 코딩이란 무엇 일까요?
쉘 코드는 특별한 목적으로 사용하기 위한 기계어? 라고 하면 좋을 것 같습니다. 쉘을 실행시키는 것이 목적이죠.
쉘을 실행시킨다는 것은 보안적인 관점에서 매우 중요한 부분입니다. 쉘이 실행된다는 것은 명령어를 실행 시킬 수 있다는 것이고, 명령어가 실행이 된다는 것은 어떠한 작업도 가능하다는 이야기 입니다.
쉘 코드를 만들 때 유의사항
쉘 코드는 크기가 중요한데, 작은 크기일 수록 좋습니다.
또한 0x00(NULL)이 들어가지 않아야 합니다. NULL 값이 들어가면 실행이 되지 않습니다.
Exit Shellcode
간단하게 Exit가 실행되는 쉘 코드를 만들어 보겠습니다.
exit()가 실행되는 ASM코드 입니다. 쉘 코드를 만들때 NULL이 들어가면 안된다고 했습니다.
NULL값이 있는지 확인하기 위해 다음과 같이 objdump를 이용하여 확인합니다.
objdump를 사용하는데 그냥 사용하면 AT&T 방식으로 출력되기 때문에, -M intel 옵션을 통해서 intel 형식으로 확인합니다.
위 사진을 보면 00 값이 발생하게 됩니다.
이러한 값을 제거하기 위해서 간단한 방법을 통해 제거합니다.
xor 연산을 자기 자신과 하게 되면 값을 초기화 시킵니다. 그 후 al에 1을 넣습니다. 1이라는 값은 al에 넣어도 충분하기 때문입니다.
마찬가지로 ebx도 위와같은 이유로 작성합니다.
이렇게 작성한 파일을 objdump로 확인해 보겠습니다.
처음과 다르게 NULL 값이 사라지게 되었습니다.
쉘 코드 만들기
이제 본격적으로 쉘 코드로 변환해야 합니다.
쉘 코드로 바꾸기 위해서는 objdump 를 이용합니다. 쉘 코드로 바꾸는 방법은 2가지 방법이 있습니다.
1. objdump -d ./PROGRAM|grep '[0-9a-f]:'|grep -v 'file'|cut -f2 -d:|cut -f1-6 -d' '|tr -s ' '|tr '\t' ' '|sed 's/ $//g'|sed 's/ /\\x/g'|paste -d '' -s |sed 's/^/"/'|sed 's/$/"/g'
2. for i in $(objdump -d PROGRAM -M intel |grep "^ " |cut -f2); do echo -n '\x'$i; done;echo
저는 짧은 2번을 이용하여 바꾸도록 하겠습니다.
위와 같은 명령어를 통해서 만들어진 쉘 코드를 테스트 해야 합니다.
쉘 테스트
5줄의 SHELLCODE 부분에 objdump를 이용해 만든 쉘 코드를 넣습니다.
그 후 gcc로 컴파일을 해야 하는데 이때 옵션을 줘야 합니다.
exit 실행 코드는 단순히 종료하는 것이기 때문에 위와 같이 실행 시켜도 별다른 반응이 없습니다. 추후에 쉘 코들 작성하면서 정상적으로 작동하는 지 확인하도록 하고,
gcc옵션으로는 -fno-stack-protector -z execstack 을 사용합니다.
'High Level Technique > Shellcoding' 카테고리의 다른 글
JMP-CALL-POP 기술 (0) | 2016.03.13 |
---|---|
Hello World Shellcode (0) | 2016.03.13 |
Libc, Nasm (0) | 2016.03.11 |
Prologue, Epilogue (0) | 2016.03.11 |
Stack (0) | 2016.03.11 |