간단한 hello_world 쉘 코드 만들기 shell code
hello_world프로그램은 c언어로 만들면
#include <stdio.h>
void main(void){
write(1,"hello_world",11);
}
이렇게 만들어짐니다.
하지만 어셈블리에서는
rax에 시스템 콜 넘버를 넣어야하고
나머지(rbx, rcx, rdx)에 함수 인자값을 넣어야합니다.
그리고 실행을 해야합니다.
실행 오퍼랜드는 int 0x80입니다.
그리고 이실행 뒤에 종료 를 해야합니다.
종료를 하지 않으면 세그먼트 오류가 떠버리기떄문 입니다.
자 이제 쉥코드를 만들어 보져
쉘코드를 만들기전에 nasm이 설치 되어 있어야 합니다.
nasm 설치는
우분투
apt-get install nasm
데비안
yum -y install nasm
일단 vim으로 파일을 만들어 주세요 저는 hell.s라고 만들었습니다.
참고로 확장자는 s나 asm으로 해주셔야 합니다.
그리고 나서 이렇게 입력해 줌니다.
아 참고로 저는 fedora 20에서 만들었습니다. 64비트 버전이라서 rax를 사용합니다.
32비트 이신 분들은 r 를 e로 바꾸어 주시기 바람니다.
rax라면 eax로 바꾸어 주세여
global _start
_start
jmp go ;go로 점프합니다.
func:
xor rax,rax ;rax를 null로 만듬니다.
push 0x04 ;0x04값을 수텍에 넣습니다.
pop rax ;rax 에 0x04값을 넣습니다.
xor rbx, rbx ;rbx를 null 값으로 만듬니다.
push 0x01 ;스텍에 0x01값을 넣습니다.
pop rbx ;rbx에 0x01값을 넣습니다.
xor rcx, rcx ;rcx를 null값으로 만듬니다.
pop rcx ;rcx에 hello_world를 넣습니다.
xor rdx, rdx ;rdx를 null값으로 만듬니다.
push 0x0b ;스텍에 0x0b값을 넣습니다.
pop rdx ;rdx에 0x0b값을 넣습니다.
int 0x80 ;실행 시킴니다.
xor rax, rax ;rax를 null값으로 만듬니다.
push 0x01 ;스텍에 0x01값을 넣습니다.
pop rax ;rax에 0x01값을 넣습니다.
xor rbx, rbx ;rbx값을 null로 만듬니다.
int 0x80 ;실행시킴니다.
go:
call func ;func를 불러옴니다.
db 'hello_world' ;스텍에 'hello_world' 값을 넣습니다.
그런데 start에서 바로 call를 하면 안될까여??
되긴되여 하지만 null값이 생겨서 안됨니다.
쉘코드에는 null값이 있으면 안되거든요
참고로 쉘코드는 이런 간단한것 이외에도 다양하게 쓰입니다.
null값은 문자열 끝을 의미 합니다.
따라서 프로그램이 동작중에 종료 되어버릴수 있다는 것이져
그리고 이 어셈블리어의 흐름을 설면해 드리자면 start에서 점프로 go 로 간다음 call로 func를 불어온뒤에 hello_world 문자열을 스텍에 집어 넣습니다. 그리고 나서 func에 있는 코드를 실행 합니다.
이제 모두 입력 하셧으면 이제 컴파일을 해야져
32비트의 경우
nasm -f elf hell.s
64비트의 경우
nasm -f elf64 hell.s
이렇게 해주시면 오브젝트 파일이 만들어 짐니다.
마지막 확장자가 o로 변경되어서 새로 만들어짐니다.
ld hell.o
이 명령어로 실행가능 한파일로 만들어줌니다.
./a.out
으로 실행시켜 줌니다.
실행시키시면 hello world를 보실수 있습니다.
저는 문자열끝에 개행 문자를 넣지않아서 이렇게 되었네여
이제 objdump로 보시면 됨니다.
objdump -d a.out
명령어로 보시면 됨니다.
네 이렇게 null값이 없습니다.
이제 저코르에 \x를 붙여서 사용하시면 됨니다.
\xeb\x23\x48\x31\xc0\x6a\x04\x58\x48\x31\xdb\x6a\x01\x5b\x48\x31\xc9\x59\x48\x31\xd2\x6a\x0b\x5a\xcd\x80\x48\x31\xc0\x6a\x01\x58\x48\x31\xdb\xcd\x80\xe8\xd8\xff\xff\xff\x68\x65\x6c\x6c\x6f\x5f\x77\x6f\x72\x6c\x64
이 쉘코드를 사용하실려면
이렇게 만드신후에 컴파일 하시면 됨니다.
감사합니다.
'System > Buffer Over Flow' 카테고리의 다른 글
buffer over flow 이론 (0) | 2015.01.06 |
---|---|
bof) 스텍 기반의 버퍼오버 플로우 -default (0) | 2014.09.12 |