Rust #11: 11장 자동화된 테스트 작성하기
테스트는 작성된 코드가 의도한 대로 동작하는지 확인하는 작업입니다. Rust는 주석 및 매크로, 테스트 시행을 위해 제공되는 기본 동작 및 옵션, 단위 테스트 및 통합 테스트로 구성하는 방법을 제공합니다.
테스트 작성 방법
테스트는 코드가 예상대로 동작 하는지 확인하는 Rust 함수라고 할 수 있습니다. 테스트 함수 내용은 일반적으로 다음 세 가지 작업을 수행합니다.
- 필요한 데이터 또는 상태를 설정
- 테스트할 코드를 실행
- 결과가 기대한 것인지 주장(ASSERT)
테스트 함수의 해부
Rust에서 테스트 단위는 test 속성으로 주석이 달린 함수라고 할 수 있습니다. cargo test 를 통해 테스트 되는 단위이며, 테스트 용 실행 바이너리를 빌드하고 각 테스트 함수의 통과 또는 실패 여부를 보고합니다.
Cargo 를 이용해 새 라이브러리 프로젝트를 생성하면 기본 테스트 기능이 포함된 테스트 모듈이 자동 생성됩니다.
it_works()'함수는 #[test] 에 의해 테스트 자동화 된 바이너리 함수가 됩니다. assert_eq!`매크로는 두 값이 같은지 주장(확인)합니다. 같으면 테스트 통과이고 같지 않으면 실패가 됩니다.
it_works 를 exploration 으로 변경하면 출력 결과 달라집니다.
테스트 함수를 추가해 여려 개의 테스트를 수행할 수 있습니다.
assert! 매크로로 결과 확인하기
assert! 매크로는 true 일 때 테스트 성공, false 일 때 테스트 실패이며 panic! 을 호출합니다.
다음은 더 작은 사각형이 더 큰 사각형을 담을 수 없다고 단언하는 또 다른 테스트를 추가 해보겠습니다.
다음에는 일부러 코드에 버그를 넣어서 이 테스트 결과가 어떻게 달라지는지 봅시다.
버그가 생기면서 정상적으로 동작했던 테스트 함수들의 결과를 통해 버그를 감지할 수 있게 되었습니다!
assert_eq! 및 assert_ne! 매크로를 사용하여 같음 테스트
assert! 매크로 뿐만 아니라 assert_eq! 및 assert_ne! 매크로를 통해 테스트를 진행 할 수 있습니다.
4 와 add_two(2) 의 결과값(4) 가 같은지 주장합니다. 같으면 테스트 성공, 같지 않으면 테스트 실패가 됩니다.
add_two() 함수를 다음과 같이 수정해 버그를 만들어 봅시다.
기대했던 결과가 아니므로 테스트는 실패하며 버그를 감지할 수 있습니다!
assert_ne! 매크로는 두 값이 동일하지 않을 경우 테스트 성공, 같을 경우 테스트 실패가 됩니다.
같거나 같지않음 은 모든 기본 유형과 대부분의 표준 라이브러리 유형에서 구현되어 있지만 사용자 유형의 경우 PartialEq 를 구현해야 합니다. 또 실패할 경우 출력하는 기능인 Debug 를 구현해야 합니다. 이는 파생 가능한 특성이기 때문에 #[derive(PartialEq, Debug)] 주석을 추가하는 것으로 가능합니다.
사용자 정의 실패 메시지 추가
이 코드의 테스트 결과는 성공합니다. 실패하도록 다음처럼 수정해봅시다.
Rust는 매크로의 기능으로 똑똑하게 result.contains("Carol") 이라는 메시지를 출력합니다. 하지만 사용자 메시지로 표시하고자 할 경우, 다음의 코드처럼 할 수 있습니다.
패닉 확인 should_panic
코드가 예상한 대로 동작 하는지 확인하는 것도 중요하지만 코드가 예상대로 오류 조건을 처리하는지 확인하는 것도 중요합니다.
should_panic 속성으로 해당 함수가 panic! 되었을 때 테스트 성공으로 처리합니다! 이제 버그를 만들어서 이를 감지 하는지 확인해봅시다.
멋지네요. 그런데 panic! 이 테스트하고자 하는 원인으로 발생하지 않을 수 있습니다. 이런 경우 테스트 실패가 되어야 하는데 다음 코드처럼 expected 에 panic! 문자열을 주어 이것을 구분할 수 있습니다.
테스트 실패로 버그를 감지할 수 있습니다.
Result 테스트에서 사용
결과가 Ok 이면 테스트 성공, Err 이면 테스트 실패이며, 메시지가 출력 됩니다. 또한 panic! 이 호출되었을 때 테스트가 실패하므로 물음표 연산자를 통해 위의 코드를 좀 더 단순하게 만들 수도 있습니다. Result 를 반환하는 테스트 함수에서는 #[should_panic] 을 사용할 수 없습니다.
테스트 실행 방법 제어
cargo run 이 코드를 컴파일 한 후 바이너리를 실행하는 것 처럼 cargo test 는 테스트 모드에서 코드를 컴파일하고 테스트 바이너리를 실행합니다. 명령 옵션을 통해 기본 동작을 바꿀 수 있습니다.
병렬 또는 연속으로 테스트 실행
테스트를 더 빨리 끝내기 위해 테스트 스레드를 지정해서 병렬로 테스트를 진행할 수 있습니다.
테스트 환경이 병렬로 진행할 수 있는지 확인한 후 테스트 스레드 개수를 늘려 테스트 시간을 단축할 수 있습니다.
함수 출력 표시
특별한 인자를 주지 않을 경우 테스트 중에는 테스트가 성공했을 때는 표준 출력을 캡쳐 하지 않습니다.
다음의 인자를 주어 테스트가 성공했을 때도 표준 출력으로 자동화 된 바이너리 캡쳐할 수 있습니다.
이름으로 테스트 하위 집합 실행
다음의 테스트 코드가 있을 때,
테스트를 진행하면 모든 테스트가 수행됩니다.
단일 테스트 실행
특정 테스트만 수행하고 싶을 경우 인자로 테스트 함수 이름을 넣을 수 있습니다.
여러 테스트를 실행하기 위한 필터링
특정 이름으로 두 개 이상의 테스트 함수를 실행할 수 있습니다.
특별히 요청하지 않는 한 일부 테스트 무시
ignore 속성이 부여되었을 경우 해당 테스트 함수는 전체 테스트에서 제외됩니다.
하지만 ignore 옵션을 주었을 경우 해당 테스트 함수가 실행되게 됩니다.
테스트 구조
테스트는 복잡한 분야이며 사람들마다 다른 용어와 구조를 사용합니다. Rust에서는 단위 테스트와 통합 테스트라는 두 가지 주요 범주에서 테스트를 바라봅니다.
두 종류의 테스트를 작성하는 것은 라이브러리가 자체 또는 이용하는 측면에서 기대하는 대로 동작 하는지 확인하는데 중요합니다.
단위 테스트
단위 테스트의 목적은 자체적으로 각 기능이 정상적으로 동작하는지 확인하는데 목적이 있습니다. 라이브러리 내부의 기능이 잘 동작 하는 것을 확인합니다.
테스트 모듈 및 #[cfg(test)]
#[cfg(test)] 는 cargo build 에는 포함되지 않고 cargo test 로 테스트 중에만 해당 모듈이 포함되도록 Rust에 지시 합니다. 그러나 통합 테스트는 다른 디렉토리로 이동하기 때문에 #[cfg(test)] 주석이 필요하지 않습니다. 그러나 단위 테스트는 일반 코드와 동일한 코드에 있기 때문에 #[cfg(test)] 주석을 주어 빌드 시 바이너리에 포함되지 않도록 합니다.
앞 전에 addr 라이브러리 프로젝트를 생성했을 떄 다음과 같이 단위 테스트 코드가 생성된 것을 확인할 수 있었습니다.
비공개 기능 테스트
비공개 기능을 직접 테스트해야 하는지에 대한 논쟁이 있지만 Rust는 이를 허용합니다.
통합 테스트
통합 테스트는 라이브러리가 정상적으로 동작하는지 대상인 라이브러리의 외부에서 테스트를 진행합니다. 마치 라이브러리를 이용하는 것처럼 동일한 방식으로 공개된 API를 호출합니다. 그러므로 단위 테스트와는 다르게 비공개 기능에는 접근할 수 없습니다. 실제로 사용하는 관점에서 테스트를 수행하므로 통합 테스트 역시 단위 테스트 만큼 중요합니다.
tests 디렉토리
Rust는 tests 디렉토리가 통합 테스트를 위한 디렉토리라는 것을 알고 있습니다.
파일 이름: tests/integration_test.rs
라이브러리와는 별도의 테스트이므로 #[cfg(test)] 주석이 빠진다는 것을 알 수 있습니다.
파일 단위의 테스트를 수행하기 위해 다음과 같이 인자를 주어 테스트를 진행할 수 있습니다.
통합 테스트의 하위 모듈
통합 테스트에도 일반 코드 모듈처럼 하위 모듈로 구성해서 테스트를 진행할 수 있습니다. 다음은 테스트 함수에서 초기화 등을 이유로 공통으로 호출해야 하는 함수가 있을 경우 common.rs 등으로 만들고 호출해서 사용할 수 있습니다.
그런데 테스트 대상에 해당 함수가 포함되었습니다. 우리가 원하는 결과는 아닙니다. 이것을 해결하려면 tests/common.rs 대신 tests/common/mod.rs 의 위치에 만듭니다. 다음은 테스트 함수에서 common모듈을 호출하는 예입니다.
바이너리 크레이트 통합 테스트
Rust는 라이브러리 크레이트만 통합 테스트를 지원합니다.
Rust의 테스트 기능 코드가 변경 되었을 때 코드가 정상 동작함을 확인하는 방법을 제공합니다. 단위 테스트는 라이브러리의 여러 부분을 개별적으로 실행하고 비공개 구현 세부 정보를 테스트할 수 있습니다. 통합 테스트는 종합적으로 라이브러리와 함께 외부 코드에서 사용하는 것과 동일한 방식으로 코드를 테스트 합니다.
binaryflavor
Passion for learning and adopting new technologies with a focus on finding the right tool for the job.
라즈베리 파이로 쿠버네티스 클러스터에 MetalLB와 nginx-ingress를 설치해보자.
MetalLB?MetalLB, bare metal load-balancer for Kubernetes라즈베리 파이 클러스터 (어떤 관점에선 베어메탈)에 Load Balancer를 사용하기 위한 가장 심플한 방법 중 하나라고 생각된다. 설치Helm 차트를 이용하여 클러스터에 MetalLB를 배포한다. Helm 레포를 추가하여 MetalLB를 설치할 준비. helm repo add metallb https://metallb.github.io/metallb helm repo update 그리고 Cluster가 속해있는
Chrome에서 HTTPS 걸린 로컬호스트 (localhost) 로그인하기
chrome://flags/#allow-insecure-localhost크롬 URL에 위 주소를 입력하면 아래와 같은 화면을 볼 수 있다. "Allow invalid certificates for resources loaded from localhost." 메뉴를 "Enabled" 처리한다. 끝. inlets 계정 만들 뻔 하다가 돈 굳었다! >
Terraform 으로 aws lambda & function url 만들기 (단일 람다 함수에 API GW 없이 URL 붙이기)
Announcing AWS Lambda Function URLs: Built-in HTTPS Endpoints for Single-Function Microservices | Amazon Web ServicesOrganizations are adopting microservices architectures to build resilient and scalable applications using AWS Lambda. These applications are composed of multiple serverless functions that implement the business logic. Each function is mapped to API endpoints, methods, and resources
terraform 에서 aws IAM policy 깔끔하게 templatefile로 말아넣기!
templatefile() 함수 쓰기templatefile - Functions - Configuration Language | Terraform by HashiCorpThe templatefile function reads the file at the given path and renders itscontent as a template.Terraform by HashiCorpTerraform 0.12 부터 사용할 수 있는 templatefile() 을 쓰면 IAM을 잘 말아 쓸 수 있습니다. 원래는 테라폼 코드에 EOF 를 쓰며
AES-256-GCM 으로 암호화된 개인정보 Java로 복호화하기
django 서버의 개인정보를 AES-256-GCM 알고리즘으로 암호화하기이번 작업은. 성능이 매우 낮은 레거시를 쳐내는 작업이었다. 이번 작업의 요구사항은 아래와 같이 정의할 수 있었다. 성능이 기존보다 빨라야 할 것 aws KMS를 사용하고 있었는데 네트워크를 타야하다보니 암호화가 느렸다. 개인정보를 암호화하는 데 이것보다는 훨씬 성능이 빨라야 한다. 법률을 준수하는 보안 설계프로젝트 수행 시 정보 시스템을
django 서버의 개인정보를 AES-256-GCM 알고리즘으로 암호화하기
이번 작업은. 성능이 매우 낮은 레거시를 쳐내는 작업이었다. 이번 작업의 요구사항은 아래와 같이 정의할 수 있었다. 성능이 기존보다 빨라야 할 것 aws KMS를 사용하고 있었는데 네트워크를 타야하다보니 암호화가 느렸다. 개인정보를 암호화하는 데 이것보다는 훨씬 성능이 빨라야 한다. 법률을 준수하는 보안 설계프로젝트 수행 시 정보 시스템을 구축하게 되고 정보 시스템을 보호하기
FastAPI에 Rate-limit(Throttling) 자동화 된 바이너리 구현
너어어무 쉽다 이말이야!ImplementationRedis 클러스터 혹은 인스턴스 생성k8s 프로젝트 내에 redis 클러스터를 추가하였다. 운영 환경에 따라 다를 수도 있겠지만, 아래와 같은 manifest를 사용한다. 사실 꼭 redis를 사용할 필요는 없지만, 파이썬 라이브러리의 성숙함과 멀티 Pod으로 운영되었을 때를 고려한다면 쓰는 것이 좋다. apiVersion: v1 kind: Pod metadata: name: -redis
Atlassian Statuspage 도입과 자동화 적용기
도입Why you need a status page - Work Life by AtlassianA status 자동화 된 바이너리 page is an essential part of any incident communication strategy; they can can turn negative customer experiences into positive ones.AtlassianChase Wilson우리가 statuspage를 운영해야 하는 이유에 대해..많은 서비스들이 장애 발생과 해결 상태 공유를 그 사용자들에게 공유하기 위해
etcd 클러스터를 aws에 terraform으로 만들기
GitHub - byunjuneseok/aws-ec2-etcd-cluster-with-terraform: Provision EC2 etcd cluster with terraformProvision EC2 etcd cluster with terraform . Contribute to byunjuneseok/aws-ec2-etcd-cluster-with-terraform development by creating an account on GitHub.GitHubbyunjuneseokTerraform으로 작업한 etcd cluster 코드사실 별 엄청난 것을 한 건 아니고, etcd 내부 구경할 겸 EC2 etcd 클러스터를 만들어봤다. 간단하게 terraform.tfvars.example 을
라즈베리 파이로 쿠버네티스 클러스터를 만들어보자.
1. 시작!뽐뿌의 발단. 침대에 누워 유튜브의 알고리즘을 탐험하다가 하나의 영상을 보게 되었는데, 결국 카드 결제까지 가는 건 한순간이었다. 이 영상을 보고 갑자기 공대생의 피가 끓는 너낌이 들었달까? 바로 침대 위에서 맥북을 펴고 조사에 착수했다. 2. 구상하드웨어 출처 : https://kubernetes.io/ko/docs/concepts/overview/components/사실 대단한 구상은 없다.
FastAPI 에서 Request Body 를 로깅하는 방법
의외로 운영에 매우 필요한 기능인데, 깔끔한 핸들링 방법을 못찾는다. 내가 원하는 요구사항은 이랬다. 절대로 API 로직이 있는 View코드 안에 로깅을 위한 코드가 1줄도 들어가선 안된다.모든 함수마다 반복해서 적용해야 하는 것은 안된다.Middleware로 처리되었으면 좋겠다. (사실 이게 제일 어려운 포인트)아무리 찾아봤지만, 뾰족하게 생각나는 방법은 없었다. starlette의 Request body를 까는
FastAPI 에서의 No Content (204) 응답 시 꼭 해줘야 하는 것
204 No Content204 No Content - HTTP | MDNThe HTTP 204 No Content success status response code indicates that a request has succeeded, but that the client doesn’t need to navigate away from its current page.MDN개발할 땐 MDN이 매우 좋은 이정표가 될 것.RFC 7230 문서에 의하면, 204 응답의
M1 바이너리가 제공되지 않는 테라폼 프로바이더 빌드해서 쓰기 (hashicorp/template)
terraform init 실패한다.테라폼을 m1 맥북으로 사용할 때 가끔, arm64 다윈 커널용 바이너리가 없어서 terraform init 에 실패하는 경우가 있다. 내가 최근에 겪은 hashicorp/template 의 경우로 해결하는 짧은 경험을 공유하고자 한다. What is the "Provider"?Home - Plugin Development - Terraform by HashiCorpLearn about developing plugins that connect Terraform
Docker 이미지로 AWS Lambda 만들기 (Boilerplate 포함)
2020년 말, AWS Lambda의 새로운 기능으로 컨테이너 이미지 지원이 발표되었다. 기존 lambda 의 프로비저닝에 비해 얻을 수 있는 이점을 요약하자면 다음과 같다. - 최대 10GB 크기의 컨테이너 이미지로 패키징 및 배포할 수 있는 기능 제공 - Dependencies 관리 및 설치의 용이성 - 다른 linux distro 의 이미지에서도 사용 가능함. (다만,
Github Actions 의 crontab 스케쥴링 기능으로 외주 프로젝트의 Certbot SSL 인증서 재발급 자동화하기
Github Actions 에서의 crontab 스케쥴링?Github Actions은 crontab scheduling 을 지원한다. 적당히 간단한 job 을 주기적으로 돌리고 싶을 때, aws 에서 cron event 로 lambda 를 트리거하는 방법을 선택할 수도 있겠다. 하지만 이는 lambda 를 위한 추가적인 구현 수정이 필요하고 aws를 잘 모르는 개발자라면 이유모를 비용 청구에 대한 두려움이 있을
AWS S3, Cloudfront, Route53과 github Actions으로 정적 웹페이지 배포, 호스팅 자동화하기
들어가기 전에예전에 잠깐 창업에 발을 살짝 들였을 때, 팀 사이트를 오늘 소개한 방법으로 배포한 적이 있다. 새로운 블로그를 최근에 만들었는데, 이 페이지를 배포할 방법으로 netlify 같은 서비스도 고민했지만, 그냥 깔끔하게 내가 다 만들어버리고 블로그 포스팅도 하자는 생각으로 다시 시도하면서 정리하게 되었다. 이 포스트에서는 vue, react 의 Client side application 뿐만
애자일하게 졸프하기; 1학기
프로젝트 시작하기컴퓨터공학과 학생이라면 누구나 4학년에 프로젝트를 의무적으로 하게된다. 갖은 풍파(?)를 견뎌내고 29살에 4학년을 다니고 있는 나로서는 꽤나 큰 고민거리였다. 졸업 프로젝트를 남들처럼 대충대충 CRUD 어플리케이션만 만들기엔 내 시간이 너무 아까웠다. 그렇다고 어마어마한 시간을 쏟아부어 내가 만족할만한 퀄리티의 소프트웨어를 내기엔 부담이 컸다. 나는 스타트업에서 개발자로 일하고 있으며, 코로나라는 특수한 상황으로
AWS Elastic Beanstalk Amazon Linux2 환경에서의 로그 커스터마이징 (Amazon Cloudwatch & EB Web Console)
지난 블로깅을 통해 Amazon Linux 1 환경의 Elastic Beanstalk 어플리케이션을 새로운 Amazon Linux2 환경으로 마이그레이션 하는 과정을 소개하였다. 이번 포스팅에서는 Elastic Beanstalk 웹 콘솔과 Amazon Cloudwatch 를 통해서 내가 원하는 로그를 볼 수 있는 기능을 소개하려고 한다. 우리의 API 서버인 sachiel 은 모니터링을 위해 API 호출과 exception 로그를 분리해서 저장하고
elastic beanstalk Amazon Linux2 python 환경 마이그레이션 후기
HBsmith 는 메인 백엔드 API 서버와 백오피스 어플리케이션을 aws 의 elastic beanstalk 서비스를 이용하여 배포하고 있다. 2011년에 출시된 서비스인 만큼 많은 레퍼런스와 자료들이 존재하고 있으며, 모든 조직/서비스가 항상 컨테이너라는 기술이 항상 답이 될 수 없기 때문에 아직도 많이 사용되고 있는 서비스이다. 우리는 “Amazon Linux 2018.03 v2.9.20
DRF (django restframework)에서 HMAC Authentication 구현하기
Introduction내가 관리하는 API 서버는 다양한 타입의 클라이언트들로 오는 요청을 처리하고 있다. 기본적인 oauth 인증을 이용하는 웹 어플리케이션 뿐만 아니라, Windows server application, aws lambda 등 많은 어플리케이션이 HMAC 인증을 사용하고 있다. DRF (django Rest Framework)의 Permission Class 로 구현되지 않고, view 로직에 signature 검증 로직이 있는 상태다. 즉, 아무
aws MFA OTP를 잃어버렸을 때 (Google Authenticator) - DevOps엔지니어가 한 스프린트 업무를 통째로 날릴뻔한 썰
새 아이폰을 구매하고 기존 아이폰에서 마이그레이션했다. 나는 마이그레이션을 하면, Google Authenticator 앱 정보가 그대로 넘어올 거라 생각했다. 사실 아무 생각도 안하고 쓰던 아이폰을 초기화했다. 😅 매일 aws 웹콘솔을 접속하는 나에게 MFA OTP를 잃어버린 사고는 매우 치명적이었다. 이걸 당장 복구하지 않는다면, 업무에 큰 차질을 빚을 수 있었다. 급한 마음에 aws 로그인 화면에서
Infrastructure as Code 를 읽고나서 (1)
대규모 인프라 운영에 사람의 수작업을 최소화하려면 결국 자동화만이 해답이다. 자동화는 곧 스크립트나 소프트웨어의 영역이라는 점에서 클라우드 인프라 운영자라면 어쩔 수 없이 개발 세계를 기웃거릴 수 밖에 없게 된다. 계발 세계의 초기 진입 장벽을 고려하려면 개발자가 인프라 운영을 배우는 게 더 나아보이기도 한다. 어쨌든 인프라 운영자는 자동화를 위한 최소한의 개발 능력과
Binary.com FAQ
Apple/Google/Facebook을 사용하여 Binary.com 계정을 생성했다면 Apple/Google/Facebook 비밀번호를 재설정해 보십시오. 그 후에 평소와 같이 Binary.com에 로그인할 수 있어야 합니다.
Apple/Google/Facebook 대신 이메일을 사용하여 로그인하려면 다음 단계를 따르세요.
1. 로그인 페이지 에서 비밀번호 재설정을 누르십시오 . 2. Google/Facebook 계정에 사용하는 것과 동일한 이메일 주소를 입력합니다. 3. 확인 링크를 이메일로 보내드립니다. 해당 링크를 클릭하고 새 비밀번호를 설정하십시오. 4. 이제 이메일 주소와 비밀번호를 사용하여 거래 계정에 로그인할 수 있습니다.
실제 현금 계좌를 개설하기 위해 어떤 통화를 사용할 수 있습니까?
USD, EUR, GBP, AUD, BTC, ETH, LTC, USDC, USDT 통화로 실제 화폐 계좌를 개설
할 수 있습니다. 단 , 법정 화폐 계좌는 1개(USD, EUR, GBP, AUD)뿐입니다. 여러 개의(각각 자동화 된 바이너리 하나의) 암호화폐 계정(BTC, ETH, LTC, USDC, USDT)이 있을 수 있습니다.
API 토큰은 어떻게 생성합니까?
나는 내 휴대 전화를 잃어 버렸다. 이중 인증(2FA)을 비활성화하려면 어떻게 해야 합니까?
실시간 채팅을 통해 즉시 문의 하고 계정에서 2FA를 비활성화하는 데 도움을 주세요.
새 전화가 있으면 2FA 를 다시 활성화 하십시오 .
내 계정을 닫으려면 어떻게 해야 합니까?
계정을 폐쇄 하려면 여기 를 자동화 된 바이너리 자동화 된 바이너리 클릭 하세요 .
하나 이상의 Binary.com 계정을 열 수 있습니까?
이메일 주소나 Apple, Facebook 또는 Google 로그인을 통해 하나의 계정(선택한 법정 통화로)을 열 수 있습니다. 프로필에 암호화폐를 추가할 수도 있습니다.
참고: 당사 약관 에 따라 고객당 하나의 계정만 허용됩니다.
내 거래/이익에 대해 세금을 내야 합니까?
이는 거주 국가의 법률에 따라 다릅니다. 귀하의 이익 에 대해 세금을 납부해야 하는지 여부에 대해 전문적인 조언을 받으십시오 .
이메일 주소를 변경할 수 있나요?
예, 라이브 채팅을 통해 문의해 주시면 잘 도와드리겠습니다.
휴면수수료란?
지난 12개월 동안 비활성 계정에 대해 청구하는 수수료입니다. 자세한 내용 은 약관 을 참조하세요.
기업 또는 비즈니스 계정을 열 수 있습니까?
예! 라이브 채팅을 통해 저희에게 연락 하고 잘 도와주세요. 다음 정보가 필요합니다.
- 계정 관리 권한(비즈니스에 이사가 1명 이상인 경우)
- 각 이사 및 주주의 계좌를 관리하는 사람의 여권 및 공과금 청구서/은행 거래 내역서
- 사업체 주소가 포함된 공과금 고지서/은행 명세서
가입 과정에서 추가 정보를 요청할 수 있습니다.
내 계정을 어떻게 인증합니까?
인증 페이지 에서 할 수 있습니다 . 당신은거야주십시오 참고 단지 우리가 그것을 요청할 때 귀하의 계정을 인증해야합니다. 현재 계정을 인증할 필요가 없으면 이 페이지를 사용할 수 없습니다.
내 계정의 통화를 변경하려면 어떻게 해야 합니까?
가상 계정 통화는 USD로 고정되어 있지만 여기에서 실제 계정의 통화를 변경할 수 있습니다 .
다음과 같은 경우 계정 통화를 변경할 수 없습니다.
- MetaTrader 5 계정을 추가했습니다.
내 계정에 자가격리 제한을 설정하려면 어떻게 해야 합니까?
자체 배제 페이지 에서 그렇게 할 수 있습니다 .
자가 배제 제한을 조정하거나 제거하려면 어떻게 해야 합니까?
EU 또는 영국에 거주하는 경우 라이브 채팅을 통해 문의 하여 잘 도와주세요.
다른 국가에 거주하는 경우 자체 배제 페이지 에서 제한을 조정하거나 제거할 수 있습니다 .
비밀번호를 잊어버렸습니다. 어떻게 해야 하나요?
여기에서 Binary.com 로그인 비밀번호와 거래 비밀번호를 모두 재설정할 수 있습니다 .
거래 비밀번호는 무엇입니까?
거래 비밀번호는 모든 MT5 계정의 단일 비밀번호로 사용됩니다. 모든 MT5 계정에 대해 다른 비밀번호를 기억할 필요 없이 거래 비밀번호만 기억하면 됩니다. Binary.com 로그인 비밀번호와는 별개라는 점에 유의하십시오.
자기 배제 란 무엇입니까?
자체 배제 는 당사 플랫폼에서 거래 활동을 제어하는 데 도움이 됩니다. 거래를 잠시 중단하려는 경우 타임아웃 날짜를 설정하고 일일 손실, 회전율, 최대 오픈 포지션 수 등을 제한하는 다양한 한도를 설정할 수 있습니다.
책임 있는 거래 에 대해 자세히 알아보십시오 .
최소 입출금 금액은 얼마인가요?
Skrill을 사용하여 최소 USD/EUR/GBP/AUD 10, 다른 전자 지갑을 사용하여 USD/EUR/GBP/AUD 5를 입금하거나 출금할 수 있습니다 . 다른 지불 방법 은 최소 금액이 다릅니다.
입금 및 출금이 처리되는 데 얼마나 걸립니까?
우리는 즉시 입금 및 1 영업일 이내에 출금을 처리합니다. 그러나 은행 및 결제 서비스 제공업체의 처리 시간이 다르기 때문에 자금이 계좌에 도달하는 데 시간이 더 걸릴 수 있습니다. 각 지불 방법에 대한 전체 처리 시간 목록은 지불 방법 페이지를 참조하십시오.자동화 된 바이너리
내 출금 확인 링크가 만료되었습니다. 나는 무엇을 합니까?
캐셔 페이지 에서 새 링크를 얻을 수 있습니다 . 철회를 클릭 하고 새 링크를 이메일로 보내십시오. 1시간 이내에 사용하시기 바랍니다 .
내 계정의 출금 한도를 제거하려면 어떻게 해야 합니까?
계정이 인증 되면 인출 한도를 제거하십시오 .
출금을 취소하려면 어떻게 해야 하나요?
다음 단락에 언급된 단계 에 따라 출납원 페이지 에서 출금을 취소할 수 있습니다 . 다음과 같은 경우 인출을 취소할 수 없습니다.
- 귀하의 출금 요청이 이미 승인 및 처리되었습니다.
인출을 취소하려면 다음 단계를 따르십시오.
3) 확인 링크가 포함된 이메일을 보내드립니다. 해당 링크를 클릭합니다.
4) 보류 중인 판매 대금 을 클릭 합니다.
5) 취소하려는 거래를 선택합니다.
6) 예 를 클릭 하여 취소를 확인합니다. 귀하의 자금은 Binary.com 계정으로 반환되며 계정 잔액은 그에 따라 업데이트됩니다.
신용 카드 입금이 실패한 이유는 무엇입니까?
신용 카드 입금에 실패한 몇 가지 이유:
- 카드 발급 은행에서 거래를 차단했을 수 있습니다. 은행에 문의하여 확인하세요.
- 3D 보안 코드가 활성화되지 않을 수 있습니다. 은행에 문의하여 확인하세요.
- 거주 국가가 카드 발급 국가와 일치하지 않습니다.
- 신용카드 잔액이 부족할 수 있습니다.
도움이 필요하면 라이브 채팅을 통해 문의하세요 .
바이너리 옵션 거래란 무엇입니까?
이 비디오를 보고 바이너리 옵션 거래의 기본 사항을 배우십시오.
외환이란 무엇입니까?
이 짧은 비디오를 보고 외환의 기초를 배우십시오:
상품이란 무엇입니까?
상품에 대해 알아보려면 이 짧은 비디오를 시청하십시오.
인덱스에 대해 알아보려면 이 짧은 비디오를 시청하세요.
얼마나 많은 거래 플랫폼을 제공합니까?
우리는 귀하의 거래 경험에 관계없이 모든 거래 스타일에 맞게 설계된 5가지 거래 플랫폼 의 다양한 제품군을 보유하고 있습니다.
거래 전략을 어떻게 자동화할 수 있습니까?
거래 봇을 사용하여 거래 자동화 된 바이너리 전략을 자동화할 수 있습니다. 거래 봇은 귀하가 제공하는 특정 지침에 따라 거래 계약을 구매하는 자동화된 컴퓨터 프로그램입니다.
코딩이 필요 없는 Binary Bot 플랫폼에서 무료로 거래 봇을 구축하십시오 . 여기에서 바이너리 봇에 대해 자세히 알아보세요 .
내 계정의 거래 한도는 얼마입니까?
계정 한도 페이지 에서 계정 한도를 확인할 수 있습니다 .
거래 가능한 시장은 언제입니까?
거래 시간 페이지 에서 각 자산 및 시장의 개시, 마감 및 결제 시간을 볼 수 있습니다 .
어떤 계약 기간을 제공합니까?
자산 인덱스 페이지 에서 각 자산의 기간을 확인할 수 있습니다 .
종합지수란?
연중무휴 24시간 이용 가능한 당사의 종합 지수는 변동성 수준이 다양한 실제 시장의 가격 움직임을 에뮬레이트합니다. 실제 기초 자산을 기반으로 하지 않기 때문에 실제 시장 이벤트의 영향을 받지 않습니다.
당사의 종합 지수 가격은 독립적인 제3자가 공정성을 위해 감사하는 알고리즘에 의해 뒷받침됩니다.
때문에 규제 요구 사항에, 우리의 합성 지수는 사용할 수 없습니다 에서 호주 , 프랑스 , 독일 , 그리스 , 이탈리아 , 룩셈부르크 , 싱가포르 , 그리고 스페인 .
어떻게 거래를 배울 수 있습니까?
바이너리 옵션, 외환 거래 등의 기본 사항을 알아보려면 시작하기 페이지를 확인하십시오 .
또한 무료 가상 계정을 열어 당사 플랫폼과 당사가 제공하는 자산에 익숙해질 수 있으며 완전히 위험이 없습니다.
준비가 되면 가상 계정을 실제 현금 계정으로 업그레이드할 수 있습니다.
바이너리 봇이란 무엇입니까?
Binary Bot은 웹 기반 자동 거래 봇 빌더입니다. 코딩할 필요 없이 드래그 앤 드롭 블록을 사용하여 자신만의 거래 봇을 구축할 수 있습니다. 각 블록에는 봇에게 거래를 실행하는 방법을 알려주는 지침이 포함되어 있습니다. 다양한 매개변수와 전략을 사용할 수 있으므로 원하는 방식으로 봇을 사용자 지정할 수 있습니다.
자세히 알아보려면 아래 동영상을 시청하세요.
메타 트레이더 5
메타트레이더 5(MT5)란 무엇입니까?
MT5는 외환, 주식, 주가 지수, 상품, 암호화폐 및 합성에 대한 액세스를 제공하는 CFD 거래 플랫폼입니다.
자세히 알아보려면 이 PDF를 읽 거나 다음 비디오를 시청하십시오.
MT5 비밀번호는 어떻게 변경하나요?
거래 비밀번호라고도 하는 MT5 비밀번호는 비밀번호 변경 페이지 에서 변경할 수 있습니다 . 거래 비밀번호는 모든 MT5 계정에 사용됩니다.
MT5 리얼 머니 계정에 어떻게 자금을 입금할 수 있습니까?
MT5 계정에 자금을 추가하려면 먼저 Binary.com 실제 화폐 계정에 입금한 다음 MT5 계정으로 이체해야 합니다.
Binary.com 계정에 이미 입금했다면 다음 단계를 따르십시오:
1) MT5 대시보드로 이동하여 자금 관리를 클릭 합니다.
2) 조금 아래로 스크롤하면 MT5 계정으로 자금 이체를 볼 수 있습니다 . 이체할 금액을 입력하고 MT5로 이체를 클릭 합니다.
3) 그에 따라 자금이 이동되고 MT5 계정 잔액이 업데이트됩니다.
MT5에서 어떻게 거래합니까?
MT5 거래의 기본에 대한 가이드 를 읽어보세요 . 또한 시작하기 페이지 에서 외환, 암호화폐 등의 CFD 거래에 대해 자세히 알아볼 수 있습니다 .
MT5에서 암호화폐를 거래하려면 어떻게 해야 하나요?
MT5에서 암호화폐 거래에 대한 기본 가이드 를 읽어보세요 . 시작하기 페이지 에서 암호화폐 CFD 거래에 대해 자세히 알아볼 수도 있습니다 .
바이너리 옵션과 MT5 플랫폼의 주요 차이점은 무엇입니까?
SmartTrader, Web Trader 및 Binary Bot과 같은 바이너리 옵션 플랫폼은 외환, 주가 지수, 상품 및 합성물과 같은 다양한 기본 자산에 대한 바이너리 옵션 거래를 제공합니다. 이러한 플랫폼을 사용하면 포지션을 열기 전에 계약 기간을 설정할 수 있으며, 이기면 얼마를 벌 수 있는지 정확히 알 수 있습니다. 거래 세계가 처음이라면 이러한 플랫폼이 더 직관적임을 알 수 있습니다.
당사의 MT5 플랫폼은 유사한 범위의 자산에 대한 CFD 거래를 제공하며, 레버리지로 포지션을 개설할 수 있고 잠재적 이익은 포지션을 청산할 때만 알 수 있습니다. 바이너리 옵션 거래보다 더 위험합니다. 왜냐하면 당신이 이기면 잠재적으로 많은 것을 얻을 수 있지만 그렇지 않으면 많은 것을 잃을 수도 있기 때문입니다. MT5는 CFD 거래의 일부로 위험을 즐기는 트레이더들 사이에서 인기가 있습니다.
MT5에서 포지션을 여는 데 필요한 최소 금액은 얼마입니까?
MT5에서 포지션을 여는 데 필요한 최소 금액은 각 자산에 필요한 증거금에 따라 다릅니다.
다음 공식을 사용하여 필요한 마진을 계산할 수 있습니다.
마진 = (거래량 × 계약 규모 × 자산 가격) ÷ 레버리지
이 공식에 필요한 모든 정보는 MT5 플랫폼에서 찾을 수 있습니다.
마진 = (0.001 x 1 x 900000) ÷ 2000 = 0.45 USD
(0.01 x 100,000 x 1.20000) ÷ 1000 = 1.20 USD
1. 이 공식은 외환 쌍에 대한 견적 통화 또는 기본 자산의 명칭에 필요한 증거금을 제공합니다. 예를 들어, USD/CHF 외환 쌍을 거래하는 경우 증거금 요구 사항은 견적 통화인 스위스 프랑(CHF)으로 계산됩니다. 반면에 변동성 지수 75를 거래하는 경우 증거금 요구 사항은 기초 자산의 명칭인 미국 달러(USD)로 계산됩니다.
2. 외환의 표준 랏은 100,000단위입니다.
MT5 계정에 어떻게 로그인합니까?
MT5 계정에 로그인하려면 다음 단계를 따르십시오.
2. 드롭다운 메뉴에서 거래하려는 MT5 계정을 선택하고 MT5 로그인 및 서버를 기록해 둡니다.
3. MT5 웹단말기에서 거래를 원하시면 웹단말기에서 거래 를 클릭하세요 . MT5 모바일 앱이 있는 경우 실행합니다.
당신의 MT5 로그인 및 거래 비밀번호를 입력 4. 선택한 서버를 , 클릭 확인 .
5. 이제 MT5 계정에 로그인하고 거래를 시작할 수 있습니다.
투자자 비밀번호는 어떻게 설정하나요?
투자자 비밀번호를 설정하려면 다음 단계를 따르십시오.
1. MT5 대시보드로 이동합니다.
2. MT5 비밀번호 관리를 클릭 합니다 .
3. 새 자동화 된 바이너리 투자자 비밀번호 텍스트 필드에 새 비밀번호를 입력하고 비밀번호 생성 또는 재설정을 클릭 합니다 .
4. 확인 이메일을 보내드립니다. 이메일에서 내 투자자 비밀번호 재설정 버튼을 클릭 합니다 .
5. 이제 투자자 비밀번호가 설정되었습니다.
BTC 계정에 어떻게 가입합니까?
BTC 계정에 가입 하는 방법에 대한 단계별 가이드를 다운로드 하세요. 기존 법정 화폐 계정이 있는 고객을 위한 BTC 계정 가입 가이드 도 만들었습니다 .
ETH 계정에 어떻게 가입합니까?
ETH 계정에 가입하는 방법 에 대한 단계별 가이드 링크를 클릭하십시오 .
또한 기존 법정 화폐 계정이 있는 고객을 위한 ETH 계정 가입 가이드 도 만들었습니다 .
블록체인이란?
블록체인은 암호화폐 네트워크에서 발생하는 모든 거래를 기록하는 공개 장부입니다.
블록체인에 대해 자세히 알아보려면 가이드를 다운로드 하거나 아래 동영상을 시청하세요.
제휴 프로그램
Binary.com 계열사로 등록하는 방법
Binary.com 제휴 프로그램에 가입하고 우리와 거래하도록 새로운 고객을 추천함으로써 온라인 트래픽에서 잠재적인 수입을 창출하십시오.
자세히 알아보려면 이 동영상을 시청하세요.
Binary.com 제휴사가 되어야 하는 이유
제휴 수수료 플랜의 종류
수익 공유
최대 35%까지 점점 더 높은 지불금을 받으세요. 계층형 커미션 시스템을 사용하면 추천된 고객이 생성한 순 수익을 기반으로 보상을 받습니다.
회전율
당사의 회전율 기반 커미션 계획은 각 계약의 지불 가능성에 따라 다릅니다. 고객에게 더 낮은 수익을 제공하는 계약은 제휴사에 더 높은 커미션을 제공합니다.
CPA(획득당 비용)(EU만 해당)
EU의 계열사는 추천에 성공할 때마다 커미션으로 USD 100를 받을 수 있습니다. 추천된 고객은 고유한 제휴 링크를 통해 실제 현금 계정을 개설하고 계정에 총 USD 100 이상(일회성 또는 누적)을 입금해야 합니다.
누가 Binary.com 제휴사로 지원할 수 있습니까?
웹마스터
Forex 또는 바이너리 옵션을 홍보하는 웹사이트를 운영하십니까? 당사의 글로벌 제휴 자동화 된 바이너리 네트워크에 가입하고 온라인 트래픽을 수익으로 전환하십시오.
트레이딩 전문가
유용한 트레이딩 통찰력과 멘토링을 통해 잠재적인 커뮤니티와 기존 온라인 트레이더로 구성된 커뮤니티를 성장시키면서 추가 수입을 얻으십시오.
웨비나 발표자
거래 매니아의 청중과 온라인 거래 토론을 통해 수익을 창출하면서 거래 경험을 개선할 수 있습니다.
웹 및 소프트웨어 개발자
Binary.com API를 사용하여 구축한 거래 응용 프로그램 및 인터페이스를 통해 새로운 고객을 유치할 때 수수료를 받습니다.
소셜 미디어 관리자
온라인 거래 전용 소셜 미디어 페이지를 관리합니까? 우리와 파트너 관계를 맺고 잠재 고객을 잠재적인 수익으로 전환하십시오.
블로거 및 블로거
온라인 거래에 대한 페이지 또는 비디오 채널을 유지하고 계십니까? 수상 경력에 빛나는 바이너리 옵션 플랫폼에서 거래하도록 추종자와 시청자를 추천할 때 보상을 받으세요.
가입 비용이 있나요?
별말씀을 요. 제휴 프로그램에 가입하는 것은 완전히 무료이며 앞으로도 계속될 것입니다.
추천된 클라이언트의 정의는 무엇입니까?
추천된 클라이언트는 귀하의 고유한 제휴 링크를 통해 추천되고 Binary.com 계정에 돈을 입금한 사람입니다. 다음 기준을 충족해야 합니다.
Time Travel Debugging을 사용한 윈도우즈 리버스 엔지니어링 1
리버스 엔지니어링 방법론은 계속 변화하고 있습니다. 전통적인 디버거를 사용하는 방법에서, 최근에는 급격히 자동화 된 툴들을 사용하는 경향성이 커지고 있습니다. 특히, 취약점 연구에 있어서 Code Coverage Guided Fuzzing과 같이 코드의 실행 커버리지를 측정하여 인풋의 변이를 조정하는 형태의 퍼저들이 유행하고 있습니다. 이러한 여러 추세에 맞추어 윈도우즈에서 리버스 엔지니어링에 유용하게 사용될 수 있는 Time Travel Debugging에 대해서 정리하였습니다.
Dynamic Binary Instrumenation이란 무엇인가?
DBI(Dynamic Binary Instrumentation)는 이미 존재하는 바이너리의 인스트럭션들을 새롭게 재가공하여 새로운 인스트럭션을 만들어 내어 원하는 행위를 수행하는 것을 말합니다.
DBI의 목적은 필요에 따라서 여러가지가 있을 수 있습니다.
새로운 플랫폼에서의 실행: 예를 들어 인텔 플랫폼에서의 바이너리를 새롭게 해석하여 ARM 플랫폼에서 동작하게 만드는 등의 작업이 가능합니다.
프로그램 행위 분석: 프로그램의 성능 프로파일링이나 행위 추적을 위해서 사용 가능합니다.
취약점 연구: 취약점을 찾아 내기 위한 용도로 사용됩니다. 대표적으로 Code Coverage Guided Fuzzing을 위해서 사용됩니다. AFL(American Fuzzy Lop)은 초기에 소스코드에 instrumentation코드를 집어 넣는 Compile-Time Instrumentation 형태로 개발되었지만, WinAFL과 같은 윈도우즈에 포팅된 코드에서는 DynamoRIO라는 DBI 툴을 사용하여 코드 커버리지를 확인합니다.
취약점 Triage: Triage라는 용어는 한국어로 번역하기에 굉장히 애매한 단어로서, 전쟁 중의 부상자들을 임시 수용소 등에서 응급처리하는 등의 행위 등을 일컫는 용어 입니다. 소프트웨어에서의 triage는 이러한 프로그램의 취약점이나 문제점등에 대해서 원인을 파악하고 (root cause analysis) 향후 대책을 논의하는 행위를 의미합니다.
DBI 툴들
-
등의 문서에서 이미 DBI와 같은 개념과 DynamoRIO등을 소개하고 있습니다.
-
와 같은 문서를 통해서 간단하게 PIN툴등을 사용하여 어떻게 이러한 작업이 가능한지 알 수 있습니다.
-
자동화 된 바이너리
- TTD는 마이크로소프트 내부에서 소프트웨어 triaging나 퍼징 등을 위한 프레임워크로 사용되던 툴입니다. 최근 일반에 툴이 공개되었고 여러 목적으로 사용이 가능해졌습니다. TTD의 장점은 아무런 프로그램 작성 없이 바로 사용이 가능하다는 점입니다. 단점은 지원되는 플랫폼이 윈도우즈로 한정 되어 있다라는 점입니다. 윈도우즈 플랫폼에서 행위 분석이나 Root Cause Analysis등을 수행하기 위해서 적절한 툴로 생각 할 수 있습니다.
TTD란 무엇인가?
Time Travel Debugging의 개념은 이미 2006 마이크로소프트사의 유명한 논문인 Framework for Instruction-level Tracing and Analysis of Program Executions를 통해서 제시 되었습니다. 이 툴에서 언급된 DBI 프레임 워크는 이후 마이크로소프트의 Code Coverage Guided Fuzzing 방법론과 툴 개발에도 지대한 영향을 끼쳤습니다.
이 프레임워크는 Nirvana라는 instrumentation 툴을 타겟 프로세스에서 활성화 시켜, 코드들을 instrumentation하고 iDNA Trace Writer로 효과적으로 압축된 Trace 파일을 생성해 냅니다. 이렇게 생성된 Trace 파일은 iDNA Trace Reader를 통해서 읽혀지며, WinDbg 등의 툴들을 이용해서 로딩하는 것이 가능해집니다. 이러한 저장과 로딩의 개념을 통해서 소프트웨어의 문제가 생겼을 경우 향후 triage나 Root Cause Analysis가 가능해집니다. WinAFL에서 DynamoRIO를 사용해 Code Coverage Guided Fuzzing이 가능하듯이, Nirvana와 iDNA 프레임워크를 사용해서 똑같은 개념의 퍼징을 수행하였습니다. 현재 이러한 퍼징 방법론은 Azure를 통해서 Microsoft Security Risk Detection Service (MSRD)이라는 서비스로 제공되고 있습니다.
- 출처: “Framework for Instruction-level Tracing and Analysis of Program Executions”
TTD는 WinDbg Preview의 컴퍼넌트로 제공됨으로, 다음 링크를 통해서 다운로드 받고 인스톨할 수 있습니다. 윈도우즈 스토어를 통해서 인스톨이 가능하지만, 한 기계에서 한번 인스톨된 바이너리들만 다른 기계로 카피하여 사용하는 것도 가능합니다.
기본적인 사용법
WinDbg Preview를 실행하면 다음과 “Start Debugging” 메뉴 아래의 “Launch executable (advanced)” 메뉴를 통해서 TTD가 활성화 된 상태로 프로그램을 실행하거나, “Attach to process” 메뉴를 통해서 이미 존재하는 프로세스에 대해서 TTD 모듈을 인젝션할수 있습니다.
다음은 notepad.exe를 실행시키면서 TTD 모듈을 인젝션하는 화면입니다.
다음은 이미 실행된 프로세스에 대해서 TTD 모듈을 인젝션하는 화면입니다.
덤프 저장과 열기
기본적인 테스트를 위해서 다음과 같이 TTD 모듈이 인젝션된 상태에서 테스트 메시지를 노트패드에 입력하고 test.txt라는 파일로 저장합니다.
TTD 레코딩을 마치기 위해서는 WinDbg에서 다음과 같이 “Stop and Debug” 버튼을 클릭해 줍니다.
레코딩이 모두 이루어지고, WinDbg에서 해당 Trace 레코딩 파일을 다시 읽게 되는데, 성공적으로 로딩될 경우 다음과 같은 화면을 볼 수 있습니다.
먼저 위쪽 타이틀 바에는 trace 파일의 이름이 디스플레이 됩니다. 그리고, 리본 메뉴에는 “Reverse Flow Control” 항목에 Time Travel을 위한 여러 컨트롤 버튼들이 위치합니다. 아래쪽 커맨트 페인에는 Time Travel Position이 2B:0가 디스플레이 되어 있습니다. 이 위치 마커는 현재 인스턹션의 위치를 표시합니다. 이 마커를 기록해 두고, 나중에 다시 똑같은 실행 위치로 되돌아 가는 것도 가능합니다.
예를 들어 여러 가지 디버깅 오퍼레이션을 진행하다가, !ttdext.tt 명령을 사용하여, 2B:0 위치로 되돌아 가는 것이 가능합니다.
!ttdext.help 명령을 사용하면, 기본적으로 Time Travel을 위한 여러 명령어들을 확인할 수 있습니다.
컨트롤 플로우
기본적으로 WinDbg에 기존에 제공하는 여러 명령어들을 그대로 사용할 수 있습니다. 다만, 다음과 같은 기존의 컨트롤 플로우 명령어들은 그에 대응하는 백워드 명령어들이 존재합니다.
명령어 | 백워드 명령어 | 작용 |
---|---|---|
t | t- | 일반적으로 스텝 명령어에 해당하면 하나의 인스트럭션을 실행시킵니다. 서브루틴이나 인터럽트가 발생하면 해당 루틴으로 들어 갑니다. |
p | p- | 하나의 명령어를 실행 시키며, 서브루틴이나 인터럽트가 발생할 경우 해당 루틴으로 들어 가지 않고 다음 명령으로 넘어 갑니다. |
g | g- | 현재 위치에서 브레이크 포인트를 만날 때까지 프로그램의 실행을 진행합니다. g-의 경우 프로그램을 거꾸로 실행합니다. |
기존의 bp, bu, bm, ba와 같은 breakpoint 명령은 모두 그대로 사용 가능합니다.
예제 API 추적하기
노트패드 예제를 다음과 같이 실행해 보겠습니다. 이 예제의 목적은 WriteFile API를 추적하여 어떠한 컨텐츠를 파일로 저장하는지를 찾아 내는 것입니다. 물론 일반적인 디버거를 통해서도 이러한 작업은 손쉽게 이루어지지만, Time Travel Debugging의 기본적인 사용법의 예제로 간단히 테스트해 보겠습니다.
일단 kernelbase 모듈에 존재하는 WriteFile로 시작하는 API들을 리스팅해 봅니다.
KERNELBASE!WriteFile 함수에 bp 명령을 사용하여 브레이크포인트를 겁니다.
이제 Time Travel 기능의 g- 명령을 이용하여 타겟을 거꾸로 실행을 합니다. 이때에 실제로 프로그램의 실행은 일어나지 않으며 다만 Nirvana 엔진을 사용하여 시뮬레이션이 일어 납니다.
다음과 같이 WriteFile 함수에 브레이크 포인크가 걸립니다.
WriteFile 함수의 프로토타입은 다음과 같습니다. 우리가 알아 내려고 하는 내용은 두번째 인자인 lpBuffer로서 LPCVOID로 선언되어 있는 메모리의 컨텐츠입니다.
64비트 환경에서 두번째 인자는 rdx 레지스터를 통해서 전달 됩니다. 이 레지스터가 가리키는 메모리의 내용을 db 명령을 통해서 덤프해 보겠습니다.
세번째 인자인 nNumberOfBytesToWrite를 통해서 정확하게 몇바이트를 쓰려고 했는지를 알아 낼 수 있습니다. 세번째 인자는 r8 인자로 전달 됩니다. 다음과 같이 길이 옵션인 L 뒤에 @r8을 넣어서 정확한 데이타를 덤프할 수 있습니다.
메모리 버퍼 추적하기
일단 API나 함수를 추적하는 작업은 손쉽게 이루어집니다. 노트패드는 일종의 테스팅을 위한 타겟으로서 연습을 위해서 이 메모리 버퍼의 내용이 어떻게 생성되고 WriteFile 함수로 전달 되었는지를 추적해 보겠습니다. 이러한 류의 메모리 컨텐츠 트레이싱 작업은 여러 RCA나 크래쉬 분석 등을 위해서 자주 수행해야 하는 작업입니다.
추적하려는 메모리의 내용이 rcx 레지스터에 존재하므로 ba 명령으로 메모리 브레이크 포인트를 걸어 주고, g-로 실행을 거꾸로 해 주어 그 메모리에 쓰는 인스트럭션을 찾습니다.
다음과 같이 브레이크 포인트가 걸리면, 해당 인스트럭션에서 t- 명령으로 바로 전 명령어로 움직입니다.
ba 명령의 경우 억세스가 일어난 직후에 브레이크 포인트가 떨어지기 때문에 t-로 한 인스트럭션 앞으로 전진해 주어야 메모리에 값을 넣는 진짜 명령어를 볼 수 있습니다.
이 상태에서 r9과 cl의 내용은 다음과 같습니다. r9이 타겟 메모리의 주소이고, cl에 그 주소에 쓰려는 문자(0x54)가 들어 있습니다.
더 t-를 실행하여 앞의 명령을 계속 추적하면, cl은 rax+rbx 메모리에서 꺼내어져 온다는 것을 파악할 수 있습니다.
rax와 rbx의 내용을 살펴 보면, rbx는 주소이고 rax가 일종의 인덱스로 사용됨을 파악할 수 있습니다.
rbx가 가리키는 메모리를 덤프해 보면 다음과 같이 일종의 아스키 테이블이 존재함을 알 수 있습니다. rax로 전달된 0x54는 아스키 값으로서 이 테이블에 의해서 아스키인 0x54로 그대로 유지 됨을 알 수 있습니다.
조금 더 그렇다면 이 원래의 rax 인덱스값은 어디에서 왔는지 똑같은 방법으로 추적해 봅니다. t- 명령을 실행해 보면 eax가 rdx가 가리키는 메모리에서 왔다는 것을 파악할 수 있습니다.
rdx가 가리키는 곳에 원래의 캐릭터 코드들이 존재합니다.
rdx의 내용을 캐릭터들과 함께 덤프해 보면 더 명확해 집니다.
추가적으로 이 와이드 캐릭터 스트링이 어디에서 생성되었는지 추적해 보려면 rdx 메모리에 대해서 브레이크 포인트를 걸어주면 됩니다.
브레이크 포인트를 확인해 보면, memcpy에 의해서 메모리 카피가 일어 났다는 것을 알 수 있고, 콜스택을 확인하면 COMCTL32!Edit_InsertText가 노트패드의 텍스트를 저장하는 함수라는 것을 알 수 있습니다.
이번화에서는 윈도우즈 플랫폼에서 여러 용도로 사용 가능한 TTD의 사용법에 대해서 간단히 알아 보았습니다. 간략한 기능 소개를 위해서 노트패드라는 대상을 사용하여 함수 추적이나 메모리 추적이 어떻게 가능한지에 대해서 알아 보았습니다. 여기에 나오는 몇몇 작업들은 TTD가 아니면 정말 많은 시간과 노력을 가해야 파악할 수 있는 내용들이 많습니다. 일반적인 디버깅의 경우 일단 어떠한 인스트럭션들이 실행되고 나면 다시 되돌아 가기가 힘들기 때문에 조금의 역추적도 수많은 정적 분석과 함께 많은 시간에 걸쳐 이뤄지는 경우가 많습니다. TTD는 많은 경우 이러한 수고를 낮추어주는 역할을 합니다.
이러한 Time Travel Debugging은 다른그림의 영문 리서치 블로그인 Vulnerability Root Cause Analysis With Time Travel Debugging에서 언급한 바와 같이 굉장히 분석이 어려운 Crash 케이스에 대해서도 RCA를 수행하기 위해서 효율적으로 사용 가능합니다. 다음 화에는 이러한 RCA를 위해서 사용 가능한 여러 TTD의 기능과 함께 간단한 예제에 대해서 학습해 보겠습니다.
자동화 된 바이너리
CI는 애자일 프로젝트를 수행하는 데 많은 도움이 됩니다.
애자일 방법론에 관해 이야기하기에는 이 글이 너무 길어지기 때문에 여기를 보고 오시면 좋을 것 같습니다.
애자일 개발 방법론은 빠른 배로플 기반으로 하는데, CI는 애자일에서 필요한 속도를 얻는데 도움을 줍니다.
하지만 어떻게 CI가 이 과정에서 도움이 될까요? 간단한 예제를 통해 알아봅시다.
기능을 개발할 떄는 코드를 여러번 수정하게 되는데, 이 과정에서 코드를 반영하고, 버전 관리 시스템에서 변경 사항을
가져오고, 소스코드를 빌드하고, 단위테스트를 진행하고, 통합된 코드를 빌드하고, 이를 묶어 배포하는 등 여러 과정을 수행합니다. CI 환경에서는 젠킨스 같은 도구를 이용해 모든 과정을 빠르게 에러 없이 진행할 수 있습니다.
알람을 추가하면 이 과정은 더욱 빨리집니다. 팀원이 빌드, 통합, 배포, 실패를 빨리 알아차릴 수 록 더 빨리 대응할 수 있습니다. CI에서 수행되는 모든 절차는 다음 그림과 같습니다.
저는 webhook을 통해서 Github에서 push하면 Jenkins에서 webhook을 받아서 Gralde을 통해서 테스트-빌드를 수행한 후 깃허브에서 결과를 알람으로 받고, 추가로 Slack를 통해서도 알람을 받도록 하였습니다.
위의 알람을 받는 과정에서는 다음 글에서 설명하도록 하겠습니다.
따라서 즉, 이런 방법을 통해 팀은 기능을 빠르게 개발할 수 있습니다. 즉 애자일 방법론의 기민함은 CI를 통해 달성된다고 볼 수 있습니다.
CI를 통해 이득을 볼 수 있는 프로젝트 종류
최근 거의 모든 제품에는 임베디드 스포트웨어가 탑재되고 있습니다. 이런 것들은 소프트웨어 관련 기능이 포함돼어 있습닏. 따라서 제품의 소프트웨어 기능이 마케팅에 이용되고 있습니다.
새로운 제품을 홍보해야 하는 상황이 늘어남에 따라 제품은 점점 복잡해지고 있습니다. 복잡해짐에 따라 애자일 방법론과 CI가 대중의 관심을 받기 시작했습니다. 웹 기반 프로젝트, 전자상거래 프로젝트, 모바일 애플리케이션 개발 등 거의 모든 종류의 프로젝트에서 CI를 활용할 수 있습니다.
CI와 애자일 방법론은 자바, 닷넷, 루비 온 레일즈 등 현존하는 모든 종류의 프로그래밍 언어를 사용하는 프로젝트에서 사용할 수 있습니다.
CI 절차의 구성 요소
1. 버전 관리 시스템
전 Git을 통해 버전을 관리 하고 있습니다.
전 GIt flow 브렌치 관리 전략을 사용하고 있습니다.
CI 도구는 단순히 지휘자 역할을 합니다. CI 도구는 CI 시스템의 중심에 위채해 버전 관리 시스템, 비들 도구, 바이너리 관리도구, 테스트 및 프로덕션 환경, 소스코드 분석 도구 및 자동화 테스트 도구 등을 연결합니다.
대표적으로 Jenkins, GitLab CI, Trvais CI가 있습니다.
- GitLab CI, Trvais CI는 Jenkins에 비해 플러그인이 적습니다.
- 또한 Trvais CI 같은 경우에는 유료 서비스를 이용할 경우 가격이 꽤 비쌉니다.
- 무료입니다.
- 많은 플러그인을 지원하며, 커스터마이징이 다양합니다.
- 많은 사용자들을 보유하고 있고, 관련 문서가 많습니다..
- 호스팅을 직접해야하기 때문에 관련된 모든 부분을 관리할 수 있습니다.
고려해야할 사항이 있습니다. Build Server를 직접 구매 및 운영해야 하기 때문에 발생하는 단점이 있습니다.
하나부터 열까지 전부 환경설정을 구축해야하며, 서버를 관리하는데 발생하는 비용이 낭비가 될 수 있기 때문입니다.
따라서 규모가 크지않은 프로젝트거나, 외부 클라우드 서비스를 이용하는 상황등이라면 Jenkins말고 다른 서비스도 고려해볼 가치가 있다고 생각합니다.
하지만 저는 현재 규모가 크고 대용량 트레픽을 고려한 서비스를 만들고 있고, 네이베 클라우드에서 무료로 10만 크레딧을 지원해주기 때문에 저는 Jenkins를 사용하기로 결정했습니다.
개발을 하면서 느끼는 거지만, 모든 일에 정답은 없다고 생각합니다. 상황에 맞게 최선의 방법을 채택하여 가장 높은 효율을 낼 수 있는 방안을 선택하는 것이 중요하다고 생각합니다.
4. 자동으로 시작되는 빌드
빌드 자동화는 코드를 컴파일하고 실행 파일을 만들어내는 여러 단계를 자동화하는 것입니다. 주로 엔트, 메이븐, 그래들 같은 빌드 도구로 자동화합니다. 자동으로 시작되는 빌드는 CI 시스템에서 가장 중요한 부분으로, 다음 두가지 조건이 충족돼야 합니다.
- 빠른 속도 자동화 된 바이너리
- 코드나 통합 이슈를 최대한 빨리 잡아내는 것
빌드가 하루에 100~200번 발생하는 프로젝트도 있는데, 이경우에는 속도가 매우 중요합니다. 빌드를 자동화하면 많은 시간을 절약할 수 있고 빌드를 시작시키는 행위도 자동화되면 변화는 더욱 커집니다.
코드가 변화하면 자동으로 빌드가 시작되게 하는 시스템은 더욱 많은 시간을 절약시켜 줍니다.
빌드가 자주 발생하고 빠르게 수행되면 플임 워크에서는 여러 여러 이슈(빌드 에러, 컴파일 에러, 통합 에러)등을 발견할 확률이 높아지고 발견되는 시점도 빨라집니다.
소프트웨어의 품질을 유지하려면 다양한 테스트 시나리오를 통해 소스를 테스트해야 합니다. 테스트를 간과하면 납기 지연이나 고객 불만족이 야기될 수 있습니다. 테스트는 수작업이고, 오랜 시간이 소요되는 반복적인 일이기 때문에 테스트 과정을 자동화하면 소프트웨어 배포에 걸리는 시간을 대폭 단축시킬 수 있습니다.
테스트를 자동화할 때에는 몇 가지 사항을 고려해야 합니다.
- 중요하고 구현하기 쉬운 테스트 케이스를 먼저 자동화하는 것이 현명한 방법입니다.
- 모든 테스트 자동화 된 바이너리 자동화 된 바이너리 절차가 동일하지만 다양한 데이터를 통해 테스트 되는 케이스가 좋은 예제 입니다.
- 또한 소프트웨어의 기능 중 여러 플랫폼에서 테스트 되는 케이스르 자동화하는 것이 좋습니다.
- 또한 다양한 설정이 적용돼 실행되는 소프트웨어의 테스트를 자동화하는 것이 좋습니다.
6. 바이너리 관리도구
소스코드는 CI를 통해 주기적으로 빌드돼 바이너리 파일로 만들어집니다. 바이너리 관리도구는 바이너리 파일의 버전 관리 시스템입니다.
바이너리 관시 시스템은 .jar, .war, .exe 등의 파일을 관리합니다. 빌드가 수행되고 필요한 검증이 진행된 후, 빌드된 바이너리 파일들이 바이너리 관리 도구로 복사됩니다. 이를 통해 개발자나 테스터가 수동으로 필요한 바이너리를 골라 배포하고 테스트할 수 있씁니다. 자동화된 테스트가 구성돼 있다면 빌드된 바이너리 파일은 자동으로 적합한 테스트 환경에 배포됩니다.
바이너리 관리 도구의 가장 중요한 장점은 결과물이 중앙 서버에 저장돼 필요할 때마다 쉽게 접근 가능해지는 것 입니다. 따라서 우리는 쉽고 간단하게 배포 환경을 만들 수 있습니다.
0 개 댓글