본문 바로가기
해킹/시스템해킹

시스템 해킹 별 찍기 프로그램 구현

by 맑은청이 2020. 8. 4.
728x90
반응형

이와 같은 별 찍기를 어셈블리어로 작성해봅시다.

먼저 c 언어 코드로 작성을 해보았습니다.

 

이제 이걸 어셈블리어 코드로 옮겨볼겁니다. 

 

n = 높이 = r8

i = 큰 = r9 

j = 작은 = r10 

 

으로 할당해주겠습니다.

다음과 같이 '*' 문자열을 가리키는 STAR 와 0x0a - 줄바뀜 변수인 EMPTY 를 선언해줍니다.

WRITE 를 해야하기 때문에 rax 에는 1을 넣어주고 rdi 모드도 1로 선언해줍니다. 별을 하나씩 출력해줄거기 때문에 rdx 에는 1을 넣어주어야합니다. r10 는 위에서 말했듯이  j 이기 때문에 0으로 초기화를 해줍니다. 

스택 프레임이 받은 변수 7, RET , RSP 이렇게 깔립니다. 64비트기 때문에 각자 8비트가 됩니다. 

그래서 입력된 수를 받기 위해서는 RSP + 16 을 r9 에 넣어줍니다. 

 

r9 의 넣은 수가 0이면 바로 프로그램을 끝내면 됩니다.

여기서 movzx 는 mov 와 거의 동일한데 부호없는 정수에 사용이 됩니다. 

 

_done 함수는 다음과 같이 작성되어 있습니다.

만약 0이 아니라면 아래 코드들이 실행됩니다. cl 은 오직 한 바이트만 담을 수 있는 변수있데 어차피 한 자리 수만 받을거기 때문에 cl 로 r9의 값을 받아줍니다. 그리고 cl 을 다시 r9 에 넣어줍니다. 이렇게 r9의 한자리 수만을 넣을 수 있을 겁니다. 

입력을 받을 때 문자열로 받기 때문에 0x30 을 빼줍니다. 이를 빼주면 문자열을 정수형으로 바뀔 수 있습니다. 

 

입력 받은 수를 r8, 즉 n 에 넣어주고 r9를 0으로 만들어 줍니다. 

 

이제 call _syscall을 불러줍니다. _syscall 은 다음과 같이 정의되어 있습니다.

 

그럼 이제 밑으로 내려가면서 별을 증가시키면서 찍는 부분을 작성해보겠습니다.

n = 높이 = r8

i = 큰 = r9 

j = 작은 = r10 

 

r10 과 r9을 비교해줍니다. (j == i)

이 _small 을 안 쪽 반복문을 나타내는 겁니다. 

만약 같으면 _up으로 갑니다. 여기서 _up은 줄바뀜을 해주는 함수 입니다. 

아니면 mov rsi, STAR 를 통해 별을 출력해줍니다. rax 에는 1이 들어가 있습니다. 

그리고 inc r10 를 통해 j++ 줍니다. 그리고 다시 _small 로 jmp 합니다. 

 바깥에 있는 반복문은 i가 n이 같으면 멈추기 때문에 이를 비교해줍니다. 

만약 같지 않으면 rsi 에 줄 바꿈 문자가 들어있는 EMPTY 를 넣어주고 syscall을 하면 '\n'이 출력될 겁니다. 

r10 즉 j 에는 0을 넣어주고 i는 1 증가시키고 다시 작은 반복문을 돌아야겠죠

 

감소하며 찍는 별찍기도 다음과 같이하면 됩니다.

728x90
반응형