이와 같은 별 찍기를 어셈블리어로 작성해봅시다.
먼저 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 증가시키고 다시 작은 반복문을 돌아야겠죠
감소하며 찍는 별찍기도 다음과 같이하면 됩니다.
'해킹 > 시스템해킹' 카테고리의 다른 글
포맷 스트링 버그(Format String Bug) 과 Double Free,UAF (0) | 2020.10.11 |
---|---|
로지컬 버그 (0) | 2020.08.06 |
어셈블리어로 반복문 구현 (1) | 2020.08.03 |
어셈블리어 문법 간단 정리 (0) | 2020.08.03 |
시스템 해킹 echo 구현 (0) | 2020.08.03 |