어셈블리어로 반복문 구현하기

 

nano loop.s 로 파일 하나 만들어주자

 

section .data
	msg db "A"
section .text
	gloabl _start
    
_start:
	mov rax, 1
    mov rdi, 1
    mov rsi, msg
    mov rdx, 1
    
    syscall
    
    mov rax, 60
    
    syscall

하고 파일로 만들어주고 실행하게되면 A를 출력한다

 

section .data
	msg db "A"
section .text
	gloabl _start
    
_start:
	mov rax, 1
    mov rdi, 1
    mov rsi, msg
    mov rdx, 1
    mov r10, 1
    
again:
	cmp r10, 100
    je done
    syscall
    mov rax, 1
    inc r10
    jmp again
    
done:
	mov rax, 60
    mov rdi, 0
    syscall

 

cmp는 compare함수로 두개를 비교하는 함수

 

je done에서 je는 둘이 동일할 때를 의미 즉 동일하면 done이라는 함수로 이동

 

inc r10은 r10에 1씩 더하는 것

 

jmp again은 다시 함수를 반복시키는 것

 

 

 

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

공부(9)  (0) 2021.09.21
공부(8)  (0) 2021.09.21
공부(6)  (0) 2021.09.20
공부(5)  (0) 2021.09.20
공부(4)  (0) 2021.09.19

어셈블리어 기본 문법

 

MOV : A의 값을 B의 값으로 옮긴다 MOV EAX, 100 은 EAX에 100이라는 값을 넣는 것 단, 구체적인 연산은 포함x

 

LEA : A의 값을 B의 값으로 연산을 포함하여 복사한다 LEA EAX, [EAX + 1000]은 EAX에 1000을 넣은 갑ㅅ을 다시 EAX에 삽입 이처럼 연산을 포함o

 

JMP : 특정한 위치로 건너 뛰어 코드를 실행 JMP A라고 하면 A의 위치로 뛰어서 코드가 실행된다. 비슷하게 조건 점프 명령도 존재 JA, JB, JE 등의 명령어는 두 인자를 받아서 비교한 뒤에 결과에 따라 다른 방향으로 점프할 수 있음

 

CALL : 함수를 호출했다가 다시 원래 위치로 돌아올 때 사용 JMP와 다른 점은 실행한 뒤에 끝나게 되면 RET에 저장하고 다시 원래 상태로 돌아온다는 점

 

NOP : 아무 작업도 하지 않는 명령어 1Byte의 빈 공간을 차지 보안쪽에 사용

 

RET : 현재 함수가 끝난 뒤에 돌아갈 주소를 지정하기 위해 사용

 

PUSH : 스택에 해당 값을 넣음

 

POP : 스택에 있는 값을 빼냄

 

LEAVE : 현재까지의 메모리 스택을 비우고 EBP를 자신을 호출한 메모리 주소로 채움 실행 중인 함수를 종료하기 위해 정리하는 작업에 사용

 

RAX(64bit)를 반으로 쪼개면 EAX(32bit)

 

레지스터는 시스템의 성능이 좋아짐에 따라서 2배씩 뛰기 때문에 하위 시스템과 높은 호환성을 가짐 즉 64비트 운영체제의 컴퓨터는 64비트 프로그램 및 32비트 프로그램을 모두 실행할 수 있다 반면에 32비트 운영체제 컴퓨터는 32비트 이하 프로그램만 사용할 수 있으며 64비트 프로그램을 실행할 수 없다

 

 

 

 

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

공부(8)  (0) 2021.09.21
공부(7)  (0) 2021.09.20
공부(5)  (0) 2021.09.20
공부(4)  (0) 2021.09.19
공부(3)  (0) 2021.09.19

어셈블리어로 에코 프로그램 만들기

 

입력한 문자열을 그대로 출력해주는 프로그램이 에코 프로그램

 

터미널을 키고 nano echo s

 

똑같은 값을 xor하면 반드시 0나오게 됨

 

xor은 두개 중 한개만 1일때 1을 출력

 

section .text
	global _start
_start:
	xor rax, rax
    mov rbx, rax
    mov rcx, rax
    mov rdx, rax
    
    sub rsp, 64
    mov rdi, 0
    mov rsi, rsp
    mov rdx, 63
    
    syscall
    
    mov rax, 60
    
    syscall

 

rdi에 0을 넣어 읽을 수 있게 해주었고 rsi는 어떤 문자열을 의미, 시작점 rdx는 얼마나 가져올지

 

rax 60은 sys_exit이다

 

이제 이 코드를 파일화를 해주자

 

nasm -f elf64 -o echo.o echo.s

ld -o echo echo.o

./echo

 

하면 이제 입력한대로 똑같이 출력되는 것을 볼 수 있다

 

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

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

스택프레임 이해하기

 

nano sum.c 로 sum.c 를 만들어주고

 

#include <stdio.h>

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

int main(void) {
	int c = sum(1, 2);
    return c;
}

 

리눅스는 기본적으로 스택의 취약점을 잘 알고있기 때문에 방어체계를 마련해 놓는데 이것들을 우선 꺼보겠다

 

gcc -S -fno-stack-protector -mpreferred-stack-boundary=4 -z execstack -o sum.a sum.c (어셈블리어로 변환)

 

vi sum.a 로 어셈블리어 작성된 파일을 볼 수 있다

 

vi 에디터를 끌 때에는 esc 키를 누르고 :q 를 입력해주면 된다

 

nano sum.c를 보자

 

main 함수를 불렀을 때 가장 아래 RET 이라고 return address가 들어가게 되는데 가장 아래에 쌓이게 된다

 

return address는 특정한 함수가 끝난 후에 돌아갈 장소를 의미하는 것

 

모든 함수는 return address를 가지게 된다

 

RET 위에 RBP가 있는데 스택이 시작하는 베이스 포인터이다

 

즉 여기서부터 스택이 차례대로 위쪽으로 쌓일 것을 알려주는 첫번째 공간

 

그 위에 변수 c가 있고 (main함수 처음시작했을 때)

 

그 위에 버퍼가 있다

 

이게 기본적으로 main함수를 실행했을때의 결과이다

 

이제 sum을 호출했을 때를 보겠다

 

가장 아래 RET가 존재하고 그위에 RBP 그위에 변수 c 그위에 버퍼 (여기까지가 main)

 

이제 이 위로 새롭게 함수가 들어가는 것

 

변수 x 위에 변수y 위에 RET 위에 RBP 위에 버퍼 (이 때 변수 x, y는 매개변수 값이다)

 

이 때 변수값이 RET 아래에 위치하게되는데 RET는 sum을 실행하고 난 뒤에 돌아가는 위치이고 x, y는 함수를 실행하기 위해 사용되는 도구

 

이제 sum함수를 다하고 리턴하게 되면 하나하나가 다 삭제되고

 

변수 c에는 위에서 실행한 결과 값인 3이 들어가게 되고 메인함수만 남게 되고 3을 리턴해 준다

 

이제 gcc -o sum sum.c 입력해서 컴파일을 하고 ./sum 으로 실행해보면 아무 결과도 안나온다

 

return 3이 수행되기 때문에 아무것도 안뜨는 것이고 이것을 눈으로 보고싶다면 printf명령어를 사용하면 된다

 

printf("%d\n", c); 다시 컴파일하고 실행하면 3이 출력된다

 

RET, 특정함수가 끝나고 돌아가는 위치를 해커가 조작함으로써 서버에 악영향을 끼칠 수 있는데 대표적인 기법으로는 BOF 등이 있다

 

vi sum.a 로 어셈블리어를 보자

 

main 함수부분을 보면 먼저 RET가 자리를 잡고 push로 RBP가 생기고 RBP는 RSP가 되는건데 둘이 동일한 위치를 가리키게 됨

 

RSP에서 16을 빼면 16만큼 점프를 하게 됨 이것은 16만큼 공간을 확보하여 그 안에서 어떠한 코드를 작성하겠다는 뜻

 

ESI에 2를 넣고 EDI에 1을 넣었는데 이것은 RSI와 RDI와 같다고 생각하면 된다

 

이렇게 한 이유는 최적화를 위해 다운그레이드한 것임 작동원리는 거의 흡사

 

이제 sum을 보자

 

아까 RSP가 16만큼 공간을 확보한다고 하였었는데 sum을 불러왔으니 똑같이 RET부터 시작

 

RET 위에 RBP(push) 그리고 RBP -4의 위치에다가 EDI 값(=1)을 집어넣어줌

 

RBP -8의 위치에다가 ESI 값(=2)을 넣어준다

 

그리고 -4의 RBP의 위치 즉 1의 값을 EDX에 넣어주고 -8의 RBP의 위치 즉 2의 값을 EAX에 넣어줌

 

그다음 addl %edx, %eax 므로 EDX의 값을 EAX에 더해준다

 

결과적으로 EAX=3 이 나오게 된다

 

마지막으로 RBP를 빼줌으로써 RET로 돌아갈 수 있음

 

EAX는 RAX와 같다고 봐도 무방한데

 

RAX같은 경우는 특정 함수가 끝날 때 반환 값을 가지고 있는 레지스터

 

결과적으로 sum은 3이라는 값을 반환하고 있는 것 

 

이제 다시 돌아와서 EAX=3값을 -4의 RBP에 위치

 

-4의 RBP 값을 EAX에 넣고 leave를 하고 RET를 함으로 3을 반환

 

 

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

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

+ Recent posts