목차
0. Go 언어
1. 고 어셈 소개
2. 고 어셈 레퍼런스
3. 고 어셈 프로그램 빌드하는 법
4. 고 어셈 실전 예제
0. 문제
Java나 C#처럼 GC는 있는데 VM이 없어 수행이 빠르고,
C++처럼 C나 Assembly를 통해서 주소 접근이 가능하며,
Python이나 Javascript처럼 쉽게 프로그래밍하면서도 정적 타입을 지원하며,
네이티브 바이너리로 컴파일/링크/빌드 가능하면서도 플랫폼 독립적인 프로그래밍 언어가 뭘까요.
그것은 요즘 최고로 핫하다는 Go입니다. xD
1. 고 어셈 소개
Go는 그냥 기본 스펙 자체에서 "Go Assembly"라는 기계어 수준의 특수한 언어를 지원합니다.
줄여서 고 어셈이라고 불러요.
고 어셈이란 언어가 대단히 획기적인 것이, amd64, x86, ARM 등 모든 머신 아키텍처의 기계어를 거의 대부분 아우르는 통일된 문법을 쓰거든요. (바벨탑?) 1
시스템 프로그래머(해커)들이 좋아하지 않을까 하네요.
VSCode에서는 확장 기능으로 고 어셈의 자동완성을 지원하고 있으니까, 그런 툴도 이용해서 고 어셈을 즐길 수 있습니다.
2. 고 어셈 레퍼런스
필독
참고
3. 고 어셈 프로그램 빌드하는 법
고 어셈으로 작성한 프로그램을 빌드하는 방법이 따로 있지는 않습니다.
확장자가 .s인 파일에 고 어셈 문법으로 코딩한 다음, 일반적인 Go 프로그램을 빌드할 때와 똑같이 빌드할 수 있습니다.
$ go build
아래는 헬로월드 급으로 간단한 고 어셈 예제입니다.
$ go get -v github.com/nanitefactory/asmtest
whatever.go
package main
import "fmt"
func add(x, y int64) int64
func main() {
fmt.Println(add(2, 3))
}
whatsoever.s
TEXT ·add(SB), $0
MOVQ x+0(FP), BX
MOVQ y+8(FP), BP
ADDQ BP, BX
MOVQ BX, ret+16(FP)
RET
4. 고 어셈 실전 예제
Go에는 Go 언어로 작성하고 빌드한 바이너리를 고 어셈으로 디스어셈블해 주는 기능이 있습니다.
이 기능만 알면 고 어셈 프로그래밍은 더이상의 설명서 필요 없이 그냥 끝장이네요.
1) 빌드 도중에 고 어셈을 확인하는 커맨드라인 명령어
$ go build -gcflags -S compile_me.go
2) 컴파일된 오브젝트를 고 어셈으로 디스어셈블하는 커맨드라인 명령어
$ go tool compile -S compile_me.go > output.s
3) 링크된 바이너리를 고 어셈으로 디스어셈블하는 커맨드라인 명령어
$ go tool objdump executable_binary > disassembly_output
참고
이상으로 '고 어셈'의 거의 모든 것을 요약해 봤습니다.
- 고 어셈블리어는 벨 연구소가 개발하던 "플랜 9"의 어셈블러 문법을 기반으로 탄생했습니다. [본문으로]
'Methods' 카테고리의 다른 글
티스토리 블로그에 이웃 커넥터 위젯을 추가하기 (쉽게) (7) | 2018.12.18 |
---|---|
알파 채널(투명도)의 두 가지 표현 방식: "premultiplied" 알파와 "straight" 알파 (컴퓨터 그래픽스) (0) | 2018.12.12 |
티스토리 블로그에 링크가 아닌 이웃 기능 추가하기 (6) | 2018.11.27 |
깃헙에 어두운 테마 적용하기 - GitHub Dark (0) | 2018.11.12 |
한글을 배운 윈도우 계산기 (Windows 10 UWP 앱 리버싱) (2) | 2018.10.09 |
Go 언어로 메모리 조작과 API 후킹을 구현하기 (윈도우즈 앱 리버스 엔지니어링) (2) | 2018.10.09 |
리버스 엔지니어링 분석 도구 추천 (1) | 2018.10.07 |
Reversing MAME with Cheat Engine (2) | 2018.09.27 |
Go 언어로 작성한 웹서버를 GCP의 App Engine으로 배포하기 (구글 클라우드) (0) | 2018.09.14 |
뉴비를 위한 Go 쉽게 제대로 설치하는 법 (2) | 2018.09.14 |