- NEW초롱이의 하루
- kisa
- 길은 가면, 뒤에 있다
- C언어 예술가
- Zer0 day - Zer0 day
- Information Security
- Secure-EDU
- 앙큼한유채's 일상 Story
- Library of Ezbeat (잠정 폐쇄)
- The Factory
- 안드
- 모후모후의 커뮤니티
- 공학도의 잡다한 시선
- 안드2
- IT속에 코코아
- IP주소검색(whois)
- IP주소검색(좌표포함)
- 소프트웨어 경력 관리
- 해저 케이블 지도
- MAC주소검색
- IANA
- 포트번호검색
- 자신의IP확인
- 웹페이퍼캡처
- 나의패스워드보안등급
- 웹 취약점 분석
- IT용어정리
- GitHub
- 라이브러리 모음
- 웹마당넷
- 시스템콜참고
- BCD 변환
- 보안뉴스
- 코딩도장(C, Python)
- 백준알고리즘
- 코딩테스트 연습
- 웹 사이트 테스트
- 스크립트꾸미기
- ctf대회목록
- 전자신문
- hash 크랙
- CVE
- 도메인등록
- N클라우드
- BugBountyList
- 칼리공식사이트
- CR4FTING BOX
- 아스키코드 변환
- 웹 사이트 통계 및 평가
- PDF변환
- AWS 및 클라우드 정보
- 가상화 및 서버관련
- 티오리
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 네트워크
- 리눅스
- LEVIATHAN
- ACL
- 프로젝트
- Python
- centos docker
- 쉘 스크립트
- Android
- 메소드
- API
- 쉘 스크립트 if문
- docker
- GPIO
- Shell script
- 안드로이드
- Linux
- GUI
- 그라파나
- 라즈베리파이
- synology
- RaspberryPi
- 쉘 스크립트 기초
- 자바
- System
- Java
- 클라우드
- JSP
- nginx
- Tkinter
- Today
- Total
IT창고
System 어셈블리어 본문
오늘은 어제 배웠던 컴파일에 써던 프로그램으로 어셈블리어에 대해 알아보겠습니다.
nasm 문법으로 만든 어셈블리어 입니다.
위의 어셈블리어를 C언어로 바꾸면
----------------------------------------
#include<stdio.h>
int main()
{
printf("Hell, World !!!\n");
return 0;
}
----------------------------------------
간단한 print출력문입니다.
오른쪽은 test2 파일의 메모리 정보입니다 0번 파일옵셋에 7f45 4c46이 헤더정보를 나타냅니다.
왼쪽이 objdump로 좀 더 자세히 정보를 확인할수있는데 off와 vaddr로 메모리의 크기를 알수있고 flags를 보고 어떤 세그먼트를 가졌는지 알수 있습니다.
test.asm 파일안을 보면 .bss 와 .comment는 작성하지 않았지만 확인되는데 align이 2^0이기 때문에 사실상 없다고 봐도 됩니다.
실행파일의 구조를 보면
3G 일반메모리의 시작주소가 0xc0000000이며 마지막 주소는 0xffffffff로 끝이납니다. 메모리의 주소는 리눅스 버전이나 윈도우의 버전이 높아짐에 따라 바뀌는데 레드햇 리눅스 6.2버전은 가장 초기 단계 버전이라 시스템 공부를 위하여 사용하고 있습니다.
objdump 의 -d옵션으로 실행코드만 확인해볼수있습니다.
nasm의 문법에 대해 자세히 알고 싶다면 http://www.nasm.us/xdoc/2.13.02/html/nasmdoc0.html 를 참고합니다.
test파일을 확인해보면 인자가 1개있는걸 확인할수있습니다.
어셈블리어에서 push는 인자를 전달해주는 역활을 해주고 call은 전달된 인자를 호출해주는 역활을 해줍니다.
그렇다면 어셈블리어로 간단한 프로그램을 만들어보겠습니다.
먼저 왼쪽 위에 C소스파일을 살펴보겠습니다. 인자값을 4개로 주었습니다.
이번에 오른쪽을 보면 왼쪽 C소스를 어셈블리어로 바꾼 모습입니다. PUSH값을 4개 주고 call을 4번 불러 왼쪽 아래와 같은 결과가 나옵니다.
실제 C파일이나 asm파일 모두 같은결과가 나옵니다.
어셈블리어에 대해 알아보겠습니다.
C언어 데이터타입에는 숫자(정수,실수) 문자(') 문자열(")이 있습니다 어셈블리어에서 문자와 문자열의 차이는없고 인자값을 봅니다.
숫자는 C언어일 경우 int 정수형이지만 어셈블리어에서는 16진수는 h 10진수는 d 8진수는 o 입니다.
어셈블리어 표기법에 맞게 작성하면 사용할수있습니다. golbal _start 는 외부에서 entry point를 찾을수있도록 명시합니다.
에셈블리어에는 레이블(ex. 이름표)이 있습니다. 레이블이 변수로 착각하기 쉬운데 레이블은 주소값(0x00...)만을 나타내고 변수는 값,주소,크기(int var )를 모두 갇는 값입니다.
여기서 string은 레이블에 해당합니다. 레이블의 이름은 변수처럼 무작위로 사용해도 됩니다.
어셈블리어의 데이터의 크기를 알아보겠습니다.
어셈블리어는 접두사가 있습니다 d, res가 있으며 단위는 아래와 같습니다.
byte |
unit |
C |
1 |
(b)yte |
cher |
2 |
(w)ord |
short |
4 |
(d)word |
int, float, pointer, .... |
8 |
(q)word |
long long, double |
10 |
(t)enbyte |
|
레이블 옆에 db가 있습니다. 여기서 d는 접두사이고 b는 unit 입니다 nasm에서 사용하는 문법으로 해당 사이트에 가서 데이터 타입에 대해 자세히 알수있습니다.
.bss 세그먼트안에 buffer resb 1024는 C로 바뀐다면 char buffer[1024]; 로 바꿀수있습니다. 레이블을 써주고 접두사를 사용합니다.
main: 이후의 명령어는 CPU마다 레스스트가 달아서 명령어가 모두 다릅니다. 현재 사용하는 CPU는 인텔i3이고 objdump -x 옵션에 CPU하드웨어 정보도 확인할수있습니다.
'보안 > System' 카테고리의 다른 글
System 명령어와 분기문 (0) | 2018.01.17 |
---|---|
System 어셈블리어 사칙연산 (1) | 2018.01.17 |
System 레지스터(Register) (0) | 2018.01.16 |
System 컴파일 (0) | 2018.01.11 |
System Hacking 실습환경 구성 (0) | 2018.01.10 |