본문 바로가기

High Level Technique/Shellcoding

Shellcoding

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