어셈블러는 SASM을 이용했다.
실습을 하기 위해 새로운 프로젝트 파일을 하나 생성해보겠다.
ctrl+n 키를 눌러 새 파일을 생성한다.
파일을 새로 생성하면 나와 같이 뜨지 않을 수도 있다.
그렇지만 공통적으로 section .text 밑에 코드를 쓰고,
global CMAIN
CMAIN:
와 같은 (다른 언어에서의 main()과 같은 존재) 문자 밑에서부터 프로그래밍을 할것이다.
안에 기본적으로 xor 과 ret 이라는 연산이 보인다.
xor 연산은 둘이 같으면 0, 다르면 1 을 반환해주는 연산자이고
ret 은 C 에서의 return 과 같다.
main 마지막 부분에 return 0; 를 해주는 것이라 이해하면 쉽다.
어셈블리어에서는 레지스터라는 개념이 빠질 수 없다.
다음 포스팅은 우리가 어셈블리어에서 자주 보는 레지스터들을 소개할 예정이다.
우선 오늘은 eax 정도만 알아보겠다.
eax는 누산기다.
마지막 연산 결과를 저장하고 있다고 생각하면 된다.
참고로 레지스터는 값을 1개만 저장가능하기 때문에 이 점을 유의하며 프로그래밍 하자.
eax는 64bit 에서 rax 라고 한다.
내 컴퓨터 환경은 64bit기 때문에 rax와 eax를 혼용해서 사용할 수 있다.
eax에 10을 넣고 eax의 값을 출력해보자!
코드는 이렇다. 실행은 F9 나 런버튼을 눌러서 할 수 있다.
mov eax, 10 을 해석해보자면
eax = 10;
과 같은 말이다.
어셈블리어에서 특수한 경우를 제외하고는 대소문자 구별이 없는데,
바로 특수한 경우가 나왔다.
PRINT_DEC
10진수로 print 하겠다는 소리다.
PRINT_DEC 2, eax 는 2바이트의 크기로 eax 를 출력하겠다 이말이다.
왼쪽을 보면 output에 10이 출력되는 것을 확인할 수 있다.
이번에는 변수를 하나 선언하고 그 변수의 값을 입력받아서 출력해보는 프로그램을 짜보자.
변수 선언은 section .data 부분에다가 하면 된다.
a dw 0
은 a라는 변수를 dw(data word) - 2바이트 크기로 저장하는데 값을 0으로 초기화한다.
라는 의미의 코드이다.
GET_DEC 는 10진수를 받아오는 역할이다.
2바이트크기의 10진수를 [a] 에 받아온다.
이후 a를 eax 에 넣고
2바이트 크기로 eax를 출력하는 코드이다.
input에 4를 넣고 run 하면 output에 4가 나온다.
이제 add 를 해보자.
eax에 50을 넣고, edx에 100을 넣고
add를 통해 서로 더한 값을 eax 에 넣는다.
c언어식으로 표현하자면
eax=eax+edx 인 격이다.
이렇게 나온 eax를 print 하는 코드이다.
곱셈인 imul 도 사용해보자.
a와 b를 입력받은 후
결과값은 a + b * 2 를 출력하는 코드이다.
전의 포스팅에서도 말했지만 어셈블리어는 기계어와 1:1 대응하기 때문에
한번에 연산을 할 수 없어서 곱하기와 더하기 따로 사용해주어야한다.
연산 순서가 * 가 먼저이기 때문에 b와 2를 먼저 곱해준 후
a를 더해야한다.
변수 a,b,c 를 선언하고 전부 0으로 초기화해준다.
2바이트 크기로 a와 b를 입력받은 후
b를 eax에 넣고
imul을 이용해서 2를 곱한 값을 다시 eax에 넣는다,
이후 add 를 사용해 eax와 [a] 를 더한다.
'Archive > Hacking' 카테고리의 다른 글
[ Assemble ] 어셈블리어 변수 선언 & 레지스터 데이터 (2) | 2020.04.11 |
---|---|
[ Protocol ] 프로토콜 문서 기본 지식 (0) | 2020.04.03 |
[ Assemble ] 어셈블리어 개요 & SASM 설치 (2) | 2020.03.31 |
[ Bee-Box ] 기타 Injection - OS 커맨드 injection (1) | 2020.03.30 |
[ Bee-Box ] 기타 Injection - iframe injection (0) | 2020.03.30 |