티스토리 뷰

hacking/system

nullbyte없는 shellcode

kiwiiiv 2020. 8. 2. 17:47

 

쉘 코드가 nullbyte를 갖고 있을 때, strcpy와 같은 문자열 함수를 호출할 때 모든 내용이 복사되지 않을 수 있다.

( -> strcpy 함수는 복사되는 크기가 정해져있지 않고, \00(NULL)을 만날 때까지 실행된다.)

 

따라서 nullbyte를 제거한 쉘 코드를 구해야 한다.

 

쉘을 실행시키는 기존의 c 코드는 다음과 같다.

 

shell.c

execve의 인자로 argv[0],argv,NULL이 차례로 정해진다.

어셈블리어로 이를 생각하여 보면, 첫 번째 인자는 ebx, 두 번째 인자 ecx, 세 번째 인자는 edx에 삽입되어 사용된다. 

(어쩔수없는것, 정해져있음)

 

shellcode.c

 

위의 코드에서 널 바이트를 제거한 어셈블리 코드는 위와 같다.

xor %eax, %eax 

  -> 이를 통하여 eax레지스터에 0의 값을 저장시킬 수 있다. 원래로라면 mov 0x0, %eax와 같은 명령어를 통하여 0을 저장할 수 있지만, 이런 방법으로 실행시켰을 때 널 바이트가 발생한다.

 

또한 스택에 /bin//sh 문자열을 직접 넣어주는 과정이 필요하므로

(/bin/sh도 가능하지만 크기를 맞춰주고자 /bin//sh를 이용함)

Push $0x68(h)73(s)2f(/)2f(/) … 와 같이, 리틀앤디안 방식을 이용하여 스택에 push한 후,

Mov %esp, %ebx 명령어를 통해 push한 문자열을 ebx 레지스터에 넣어 준다.

그 후 syscall을 통하여 쉘 코드를 실행시켜 주는데, 실행할 syscall 번호를 al(eax) 레지스터에 넣어 주어야 한다.

이 때 execve syscall이 실행되므로, 이의 syscall number를 알아야 한다.

 

-> (https://chromium.googlesource.com/chromiumos/docs/+/master/constants/syscalls.md)

 

위에서 시스템 콜 번호를 찾을 수 있었다. (32bit)

 

따라서 11을 eax 레지스터에 삽입해 주어야 하는데, 16진수로 변환하면 0xb값을 가진다.

 

movb $0xb, %al

  -> 이와 같이 movb 명령어를 사용하는 이유는, 0xb의 크기는 1byte이기 때문에 bite 단위를 저장시키는 movb 명령어를 사용하였다. 

만약 movb 명령어가 아닌 mov $0xb, %eax 명령어를 사용한다면, eax 레지스터의 크기는 32byte이며, mov 명령어 또한 32byte를 저장시키기 때문에 eax 레지스터에 0x000000b 가 저장된다. 즉 널바이트가 존재하기 때문에 movb 명령어를 통하여 1byte의 크기를 갖고 있는 %al 에 넣어준다.

 

그 후 shellcode.c 를 컴파일한다.

gcc -m32 shell.c -o shell

 

 

컴파일한 후 실행 파일의 operation code를 objdump -d를 통하여 보면,

objdump -d ./shell

이 중, xor 명령어 이전의 부분은 main 함수의 프롤로그 부분이며, 인터럽트 이후의 부분은 필요가 없으므로

다음과 같은 코드를 구할 수 있다.

 

 

shellcode=“\x31\xc0\x31\xd2\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\xb0\x0b\xcd\x80”

'hacking > system' 카테고리의 다른 글

함수 프롤로그/에필로그  (0) 2020.11.06
bof에 환경 변수 사용하기  (0) 2020.08.23
Buffer overflow  (0) 2020.08.23
ROP(return-oriented programming) 공부하기 .. (완x)  (0) 2020.08.16
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함