[ Assemble ] 어셈블리어 출력, add 연산, imul 연산실습

2020. 3. 31. 22:25·Archive/Hacking
728x90
반응형

 

 

어셈블러는 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] 를 더한다.

 

 

 

 

 

 

 

 

728x90
반응형

'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
'Archive/Hacking' 카테고리의 다른 글
  • [ Assemble ] 어셈블리어 변수 선언 & 레지스터 데이터
  • [ Protocol ] 프로토콜 문서 기본 지식
  • [ Assemble ] 어셈블리어 개요 & SASM 설치
  • [ Bee-Box ] 기타 Injection - OS 커맨드 injection
코뮤(commu)
코뮤(commu)
코딩으로 커뮤니케이션하는 코뮤입니다 😎
  • 코뮤(commu)
    코뮤(COMMU)
    코뮤(commu)
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Archive
        • Hacking
        • Develop
        • ETC
      • Algorithm
      • DB&Infra
      • ETC
      • Node
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • IT지식보따리
    • IT가 맛있다
    • IT 천재
  • 공지사항

    • 배고픕니다
  • 인기 글

  • 태그

    자바스크립트
    oracle db
    Python
    비박스
    코드업 기초
    Codeup
    백준 문제풀이
    보안뉴스
    C++
    파이썬 문제
    파이썬 알고리즘
    파이썬 기초
    자바스크립트 객체
    docker
    카카오 100일 프로젝트
    Oracle
    파이썬 기초 문제
    백준
    백준 풀이
    파이썬 백준
    코드업 파이썬 기초 100제
    자바스크립트 API
    장고
    javascript
    코드업
    오라클
    Git
    Django
    백준 파이썬
    파이썬
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
코뮤(commu)
[ Assemble ] 어셈블리어 출력, add 연산, imul 연산실습
상단으로

티스토리툴바