'AI Stories'에 해당되는 글 16건
- 2017.03.27 아이폰 사진보관함 용량 Clear 5
- 2017.03.14 비트코인이란? 1
- 2017.03.10 윈도우10 설치 USB 만들기
- 2017.02.20 SSD 윈도우 10 설치 오류 해결!! 11
- 2017.01.31 (Themida) 디버깅 경고 메시지 출력 해결 방법!! 4
- 2017.01.30 클라우드란?
- 2017.01.30 리틀엔디언 VS 빅엔디언
- 2017.01.29 어셈블리어(Assembly) 기초 5
- 2017.01.21 RVA to RAW(PE File Format)
- 2017.01.21 Hello World 디버깅 실습
아이폰을 오랫동안 사용하다보면 데이터들이 쌓이면서 용량이 점점 쌓이게 됩니다.
처음 폰을 구매할때만해도 영화나 음악파일을 많이 넣지 않는 이상 이 용량이 충분 할 것이라고 생각을 하줘..
그러나 고화질의 사진 촬영이나 비디오 녹화를 많이하면서 어느 순간에 사용 가능한 용량이 얼마남지 않았다는 걸 알수있줘.
심지어 어플들을 업데이트 할 때 에도 사용가능한 용량이 없다고 업데이트 조차 실패할 때도 있습니다.
그럴 때문다 사용하지 않는 어플들을 삭제 하였지만 도대체 그많은 용량을 누가 다 잡아 먹을까라고 생각을 하줘.
대표적인 주력 범인이 있습니다.
바로 사진 보관함입니다.
사진정리를 주기적으로 하지 않다보면 고화질 사진 및 데이터가 쌓여서 전체 용량의 1/3이상이나 차지하게 됩니다.
너무 비대하줘..
그래서 사진정리를 하고자 아이폰 사진을 다 백업받고 삭제를 하였더니...어라 사진보관함의 용량이 계속 남아있네요.
아이폰은 파일에 직접 접근 조작이 불가능하고 아이튠즈로만 조작이 가능한데.. 아이튠즈로 아래와 같이 빈 사진폴더로
동기화를 시켜도 똑같습니다. 사진을 다 삭제해도 사진 보관함에는 용량이 계속 잡히고 있습니다.
원인은 사진관리를 위해 동기화, 삭제 기능을 자주 사용하면서 이미지 시스템이 과거 데이터를 제대로 못찾아서 그런겁니다.
한마디로 데이터가 꼬인겁니다.
해결방법은 아이폰 파일 시스템에 직접 접속을 해서 남아있는 이미지 파일들을 강제로 삭제해주는 작업을 하면 됩니다.
이때 i-funbox라는 프로그램을 다운 받아서 사용하는데요.
위 사이트에 들아가서 프로그램을 다운받으셔서 설치를 합니다.
장치 - 빠른 도구 상자 - User File System 을 클릭을 하게되면 아래처럼 아이폰 내부 파일 시스템이 나오게 됩니다.
파일시스템 의 DCIM 폴더에 아까는 보이지 않았던 폴더들과 사진파일들이 보입니다.
이 파일들이 그 용량을 잡아 먹는 범인들입니다.
이 폴더들 쿨하게 삭제를 하면 아래와 같이 용량이 확보 된것을 볼 수 있습니다.
도움이 되셨다면 공감 한방 부탁드릴께요~!!^^
안녕하세요.
비트코인은 무엇인가요?
비트코인은 새로운 지불 시스템이자 완전한 디지털 화폐를 가능하게 하는 합의된 네트워크입니다. 중앙 권력이나 중간 상인이 없이 사용자에 의해 작동하는 최초의 분권화된 P2P 지불망입니다. 사용자 관점에서 볼 때, 비트코인은 인터넷 현금과 매우 유사합니다. 비트코인은 현존하는 가장 탁월한 삼식 부기 시스템이기도 합니다.
누가 비트코인을 만들었나요?
비트코인은 "비밀-화폐"라는 개념의 최초의 구현입니다. 이 개념은 1998년 웨이 다이가 사이버펑크들의 메일링 리스트 상에서 최초로 묘사했으며 중앙 권력보다는 암호작성술을 사용해 발행과 거래를 통제하는 새로운 형태의 통화에 대한 아이디어를 제시하였습니다. 최초의 비트코인 설계서와 개념 증명은 2009년 사토시 나카모토에 의해 암호작성술 메일링 리스트 내에 출판되었고, 사토시는 2010년 말 자신에 대해 거의 밝히지 않은 채 프로젝트를 떠났습니다. 그 이후로 커뮤니티는 기하급수적으로 증가하여 비트코인을 위해 애쓰는 많은 개발자들과 함께 하게 되었습니다.
사토시의 익명성은 자주 정당성이 없는 이의를 일으켜왔습니다. 이는 대부분 비트코인의 오픈소스로서의 본질을 잘못 이해하는데서 비롯되는 것입니다. 비트코인 프로토콜과 소프트웨어는 공개적으로 발표되었고 세계 어느 개발자나 그 코드를 검토하고 자신들만의 비트코인 소프트웨어로 수정할 수 있는 것입니다. 현재의 개발자들과 마찬가지로 사토시의 영향력 또한 다른 이들이 비트코인을 받아들임으로 인해 한정되었고 그래서 그는 비트코인을 조종하지 않았습니다. 오늘날 우리에게 있어 비트코인을 발명한 사람의 신원은 종이를 발명한 사람의 신원만큼의 의의만이 있을 것입니다.
누가 비트코인 네트워크를 통제하나요?
아무도 이메일 배경 기술을 소유하지 않듯이 아무도 비트코인 네트워크를 독점적으로 소유하지 않습니다. 비트코인은 전세계의 모든 비트코인 사용자에 의해 통제됩니다. 개발자들이 소프트웨어를 개선하고는 있지만, 모든 사용자가 사용할 소프트웨어와 버전을 자유롭게 선택할 수 있기 때문에, 개발자들이 비트코인 프로토콜에 대한 변화를 강요할 수는 없습니다. 모든 사용자가 서로 호환되는 상태를 유지하려면, 동일한 규칙을 준수하는 소프트웨어를 사용해야 합니다. 비트코인은 모든 사용자가 완전히 합의해야만 제대로 작동할 수 있습니다. 따라서 모든 사용자와 개발자에게는 이러한 합의를 지켜낼만한 강력한 동기가 있습니다.
비트코인은 어떻게 작동하나요?
사용자 관점에서, Bitcoin은 개인 Bitcoin 지갑을 제공하고, 사용자가 그것을 이용하여 bitcoin을 주고 받을 수 있도록 하는 모바일 앱이나 컴퓨터 프로그램에 불과합니다.
비트코인 네트워크는 블럭 체인이라는 공공 회계원장을 공유하고 있습니다. 이 회계원장에는 여태까지 처리된 모든 거래가 포함되어 있어서, 사용자의 컴퓨터에서 모든 거래의 유효성을 검사할 수 있습니다. 각각의 거래는, 모든 사용자가 자신의 비트코인 주소에서 비트코인을 보내는 것을 완전히 제어할 수 있도록 하는, 보내는 주소에 상응하는 디지털 서명으로 보호됩니다. 또한, 누구나 특수 하드웨어의 연산력을 사용하여 거래를 처리하고 이 서비스에 대한 댓가를 비트코인으로 벌어들일 수 있습니다. 이것을 "채굴"이라고도 합니다. 비트코인에 대한 자세한 정보는 전용 페이지와 비트코인 원본을 참고하세요.
사람들이 정말 비트코인을 사용하나요?
네. 비트코인을 사용하는 개인과 사업자의 수가 증가하고 있습니다. 여기에는 식당, 아파트, 법률사무소 그리고 Namecheap, WordPress, Reddit, Flattr 같은 인기 온라인 서비스를 비롯한 소매상들이 포함됩니다. 비트코인은 아직 새로운 사회 현상이나, 아주 빠르게 성장하고 있습니다. 2013년 8월말 현재, 유통 중인 모든 비트코인의 가치는 미화 15억 달러를 뛰어 넘었고, 매일 수백만 달러의 비트코인이 교환되고 있습니다.
비트코인은 어떻게 얻을 수 있나요?
- 상품이나 서비스에 대한 대가로서
- 비트코인 환전소에서 비트코인을 구입하세요.
- 당신 근처에 있는 누군가와 비트코인을 교환하세요.
- 경쟁적인 채굴을 통해 비트코인을 벌어들이세요.
아마 비트코인 거래소에서 신용카드나 Paypal같은 결제시스템으로 비트코인을 파는 개인들을 찾을 수 있을 것입니다. 그러나 거래소 자체에서는 이러한 결제방법을 허용하지 않습니다. 이는 누군가가 Paypal로 비트코인을 사놓고서는, 거래값의 반을 철회한 일들이 있었기 때문입니다. 이를 일반적으로 지불거부라고 부릅니다.
비트코인으로 지불하는 것은 얼마나 어렵나요?
비트코인 지불은 직불카드나 신용카드를 이용한 구매보다 쉽습니다. 또한 은행계좌가 없어도 됩니다. 지불은 당신의 컴퓨터나 스마트콘에 있는 지갑 앱에 상대방의 비트코인 주소, 지불 금액, 그리고 보내기 버튼을 누름으로 하는 것입니다. 상대방의 비트코인 주소를 입력하는 것을 더욱 쉽게 하기 위해서 많은 지갑들이 QR 코드 기능이나 스마트폰을 서로 맞대기만 하면 되는 NFC 기술들을 도입했습니다.
비트코인의 장점은 무엇인가요?
- 지불의 자유 - 세계 언제 어디서나 즉시 어떤 금액이라도 보내고 받는 것이 가능합니다. 은행 휴일 없습니다. 국경도 없습니다. 제한 한도도 없습니다. 비트코인은 사용자들이 그들의 돈에 대한 모든 통제권을 갖게 합니다.
- 매우 낮은 수수료 - 비트코인 결제는 현재 무료이거나 아주 적은 소액 거래에만 수수료가 붙습니다. 사용자들은 더 빠른 승인을 가져다 주는 처리 우선권을 얻기위해 거래에 수수료를 포함시킬 수 있습니다. 추가적으로, 상인들의 거래 처리, 비트코인의 불환화폐로의 환전, 그리고 매일 상인들의 은행계좌로 자금을 직접 예금하는 것을 돕기 위해 상인 처리기들이 따로 존재합니다. 이 서비스들은 비트코인에 기초해 있기에 PayPal이나 신용카드 네트워크보다 훨씬 더 낮은 가격에 제공될 수 있습니다.
- 상인들에게 적은 위험요소 - 비트코인 거래들은 안전하고, 철회불가하며, 고객의 민감한 또는 개인 정보를 포함하고 있지 않습니다. 상인들은 이로인해 PCI를 준수하지 않아도 되며, 사기 또는 사기성 지불거부의 피해를 덜 받습니다. 이는 신용카드가 없거나, 사기율이 너무나 높은 시장으로도 사업을 확장할 수 있는 가능성이 열린다는 것입니다. 어찌됐든 결과는 더 낮은 수수료, 더 큰 시장, 그리고 관리비용절약입니다.
- 보안과 통제 - 비트코인 사용자들은 자신들의 거래에 대한 완전한 통제권을 갖습니다. 다른 결제시스템처럼 상인들이 은근슬쩍 요금을 물리거나, 고객이 원치않은 요금을 물릴 수가 없습니다. 비트코인 거래는 또한 개인정보를 공개하지 않아도 됩니다. 이는 신분도용에 대한 강한 보안이 되며 비트코인 사용자들은 또한 자신들의 돈을 백업과 인크립션으로 보호할 수 있습니다.
- 투명성 및 중립성 - 비트코인 통화 공급에 관련된모든 정보는 블럭 체인에서 누구나 손쉽게 실시간으로 확인하고 사용할 수 있습니다. 어떤 개인이나 단체도 비트코인 프로토콜을 통제하거나 조작할 수 없는데 이는 그것이 암호 작성적으로 안전하기 때문입니다. 이로 인해, 비트코인의 코어는 완전히 중립적이고, 투명하며, 예측될 수 있음을 신뢰할 수 있습니다.
비트코인의 단점은 무엇인가요?
- 대중의 수용도 - 많은 사람들이 아직 비트코인에 대해 모릅니다. 매일 더 많은 사업들이 비트코인을 받아들이고 있으나 아직은 그 수가 작고 비트코인이 네트워크효과를 보려면 아직 성장이 필요합니다.
- 변동성 - 현재 유통되고 있는 비트코인의 시가총액과 비트코인을 사용하는 사업의 수가 아직 가능한 정도에 비해 많이 적습니다. 그렇기 때문에, 비교적 작은 이벤트, 거래, 또는 사업활동들이 비트코인 가격에 큰 영향을 끼칩니다. 이론적으로는, 비트코인 기술과 시장이 성숙함에 따라 가격의 변동성이 줄어들어야 합니다. 그렇지만 세계는 이런 창업적인 화폐를 아직 본적이 없습니다. 비트코인이 어떻게 될지는 두고봐야 할 것입니다. (흥미진진하지 않습니까?)
- 진행중인 개발 - 비트코인 소프트웨어는 아직 베타 버전이며 많은 미완성의 기능들이 활발한 개발중에 있습니다. 더 안전하고 대중들이 쉽게 접근할 수 있는 비트코인을 만들기 위해 새로운 툴, 기능, 서비스가 개발중에 있습니다. 이중 일부는 아직 모든 사람이 사용하기에는 이릅니다. 대부분의 비트코인 사업은 최근에 생겼으며 아직 어떠한 보험도 제공하지 않습니다. 전반적으로, 비트코인은 아직도 성숙하는 과정에 있습니다.
사람들은 왜 비트코인을 신뢰하나요?
비트코인에 대한 대부분의 신뢰는 그것이 신뢰가 필요없다는 데에서 나옵니다. 비트코인은 완전히 오픈소스이며 분권화되어 있습니다. 이는 누구나 언제 어디서나 전체 소스코드를 볼 수 있다는 뜻입니다. 고로 세계 어느 개발자든지 비트코인이 어떻게 작동하는지를 확인할 수 있습니다. 현재까지 발생된 모든 비트코인과 거래들을 누구나 투명하게 실시간으로 조사할 수 있습니다. 모든 지불이 제삼자의 존재여부와 상관없이 이루어질 수 있으며, 시스템 전체가 힘껏 상호 심시된 온라인 뱅킹에서 사용하는 것과 비슷한 암호 작성 알고리즘에 의해 보호됩니다. 어떤 개인이나 단체가 비트코인을 독점통제할 수 없으며, 구성원들 전부가 신뢰할 수 없더라도 네트워크는 안전하게 유지됩니다.
제가 비트코인으로 돈을 벌 수 있나요?
당신은 비트코인이나 다른 신생 기술을 가지고 부자가 되기를 일체 기대해서는 안됩니다. 사실이기에는 너무 그럴 듯 하거나 기본 경제 규칙을 거역하는 어떠한 것도 조심하는 것이 항상 중요합니다.
비트코인은 성장중인 혁신의 공간이며 이는 위기를 동반하는 많은 사업 기회들을 포함합니다. 이만큼 빨리 발달했다고 해서 앞으로도 성장을 지속하리라는 보장은 없습니다. 고로 비트코인에 관련된 것에 대해서 시간과 자본을 투자하는 것은 창업정신을 필요로 합니다. 채굴, 투기, 또는 창업과 같이 비트코인을 이용해 돈을 벌 수 있는 여러가지 방법들이 있습니다. 이 모든 방법들은 경쟁이 심하며, 이익을 보장하지 않습니다. 이러한 프로젝트에 관련된 비용과 위기를 제대로 평가하는 것은 각 개인의 책임입니다.
비트코인은 완전히 가상적이고 비물적인가요?
비트코인은 신용카드만큼 가상적이고 사람들은 온라인 뱅킹 네트워크를 매일 사용합니다. 비트코인은 여타 형식의 돈과 같이 온라인에서 또는 가게에서 돈을 지불하는데 사용될 수 있습니다. 또한 비트코인은 Casascius 동전과 같이 물리적인 형태로도 환전될 수 있습니다. 그러나 모바일폰으로 지불을 하는 것이 더 편리할 것입니다. 비트코인 잔액은 광범위한 분산 네트워크에 저장되며, 이는 누구에 의해서도 부정하게 변경될 수 없습니다. 다르게 말하면, 비트코인 사용자들은 자신들의 펀드에 대한 독점적인 통제권을 가지며, 비트코인이 가상적이라고 해서 없어질 수는 없습니다.
비트코인은 익명성을 보장하나요?
다른 종류의 돈과 같이 비트코인은 적절한 수준의 프라이버시를 제공하는 상태에서 유저들이 지불을 하고 받을 수 있도록 설계되었습니다. 그러나, 이는 현찰과 같은 수준의 프라이버시를 제공하지 않으며 익명성을 제공하지 않습니다. 비트코인의 사용은 광범위하게 공개된 정보기록들을 남김니다. 여러 메카니즘들이 사용자의 신원을 보호하기 위해 존재하나, 아직은 개발중에 있습니다. 나아가 이러한 기능들이 사용자들에 의해 올바로 사용되려면 아직 해야할 일들이 많습니다.
비트코인을 이용한 사적인 거래들이 불법적인 목적으로 사용될 수 있다는 우려들이 제기되어왔습니다. 하지만 비트코인 또한 다른 재정시스템과 같이 법적인 규제와 단속을 받을 것이라는 것은 의심의 여지가 없습니다. 비트코인은 현찰보다 더 나은 익명성을 가질 수 없고 범죄 수사에서 제외될 것이라고 기대할 수도 없습니다. 또한 비트코인이 다양한 범위의 금융범죄를 방지하도록 설계되었다는 것도 기억해야 합니다.
비트코인을 잃어버릴 경우 어떻게 되나요?
사용자가 자신의 비트코인 지갑을 잃어버리는 것은, 비트코인 통화유통에서 그만큼의 비트코인을 제거하는 효과를 가집니다. 잃어버린 비트코인들은 다른 비트코인들과 마찬가지로 블럭 체인에 남아 있습니다. 그러나 누구도 잃어버린 개인 키(들을)를 찾을 수 없기 때문에, 그 비트코인들은 소비할 수 없는 상태로 수장되는 것입니다. 수요와 공급의 법칙에 의해서 비트코인의 공급이 적어지면, 소비가 가능한 남은 비트코인들의 수요에 맞추어 그 가치가 올라가게 됩니다.
비트코인이 거대 지불 네트워크가 되도록 확장될 수 있나요?
비트코인 네트워크는 이미 오늘날의 지불 네트워크들보다 훨씬 거대한 단위의 거래들을 처리할 수 있습니다. 그러나 대형 신용카드 네트워크들과 같은 수준의 광범위한 규모를 갖기에는 덜 준비되었습니다. 현재 있는 한계들을 개선하고 있으며, 미래에 필요한 사항들이 무엇인지 잘 알고 있습니다. 태동부터 비트코인 네트워크는 모든 수준에서 성숙, 최적화, 그리고 차별화의 노력을 지속해 왔으며 오는 수년간에도 이를 멈출 계획이 없습니다. 사용량과 수용도가 성장하면서 더 많은 비트코인 사용자들이 라이트웨이트 클라이언트들을 사용하고 풀 네트워크 노드들은 더욱 전문화된 서비스가 될 것입니다. 자세한 사항은 위키의 확장성 페이지를 참고하세요.
법적 고지
비트코인은 합법인가요?
저희가 아는 최선의 한도에서 비트코인은 아직까지 대부분의 사법권에서 불법으로 정의되지 않았습니다. 아르헨티나나 러시아와 같은 어떤 사법권들은 외화에 대한 통제나 금지가 심하긴 합니다. 태국과 같은 사법권에서는 비트코인 거래소와 같은 법적실체들이 법적 허가를 받아야만 하도록 하기도 합니다.
여러 사법권의 규제기관들이 개인과 사업들이 사용하는 새로운 기술들을 공식적으로 규제되는 재정제도의 테두리안에서 이해할 수 있도록 하는 법적인 단계들을 제공하려는 노력들을 시작하고 있습니다. 예를 들어, 미국재무성 산하의 금융범죄단속네트워크 (FinCEN)는 가상화폐에 관련된 특정 활동들에 대한 비구속적인 안내서를 발행했습니다.
비트코인은 불법적인 활동에 유용한가요?
비트코인은 돈입니다. 돈은 언제나 합법적 그리고 불법적 활동들에 유용했습니다. 현찰, 신용카드, 그리고 현재의 은행시스템들만 봐도 그 금융범죄적인 사용량이 비트코인의 그것을 훨씬 상회합니다. 비트코인은 결제시스템의 엄청난 혁신을 가져올 수 있습니다. 그리고 그러한 혁신들은 그 결점보다는 이득을 더욱 고려해야 합니다.
비트코인은 돈을 더욱 안전하게 하고 금융범죄에 대한 보호와 방지를 개선하도록 설계되었습니다. 예를 들어서, 비트코인은 위조가 불가능합니다. 사용자들은 자신의 지불들에 대한 완전한 통제권을 갖으며 신용카드범죄로 인한 요금청구를 받지 않습니다. 비트코인 거래들은 철회가 불가능하며 사기성 입금취소 또한 불가능합니다. 비트코인은 백업, 인크립션, 다중서명, 등과 같은 유용한 메카니즘들을 통해 돈을 절도로부터 보호합니다.
비트코인이 은밀하고 철회 불가능한 지불이 가능하기 때문에 범죄자들에게 매력적인 도구일 것이라는 우려가 제기되곤 합니다. 그러나 이러한 것들은 이미 현찰과 전신 송금으로도 충분히 이루어지고 있습니다. 비트코인의 사용도 기존의 금융시스템의 그것과 비슷한 규제와 통제를 받을 것이라는 것에는 의심이 없습니다. 또한 비트코인은 금융기관의 범죄수사를 받지 않을수가 없을 것입니다. 일반적으로, 중요한 혁신의 돌파구들이 인정받기 전에는 그 혜택이 제대로 이해되기 이전에 논란이 많은 법입니다. 이에 대한 가장 좋은 예는 아마도 인터넷일 것입니다.
비트코인은 규제를 받을 수 있나요?
비트코인 프로토콜 자체는 원하는 소프트웨어를 선택해서 사용하는 대부분의 유저의 합의없이는 변경이 될 수 없습니다. 지역관할이 전세계적인 비트코인 네트워크안에서 특별한 권리를 행사할 수 있도록 만드는 것은 실질적으로 불가능한 일입니다. 어느 부유한 단체가 채굴 하드웨어에 투자를 많이해서 전세계의 네트워크의 거래를 처리하는 연산력의 대부분을 차지함으로 인해 특정 거래들을 막는다던지 철회할 수 있는 힘을 얻을 수 있을 것입니다. 물론 이는 세계의 다른 모든 채굴자들이 투자한 만큼을 합친 것 이상을 투자해야 얻을 수 있는 것일 것입니다.
하지만 다른 매체에 대한 방식과 비슷한 방식으로 비트코인을 규제하는 것은 가능합니다. 달러와 마찬가지로 비트코인은 매우 다양한 목적으로 사용될 수 있으며 그중 어떤 것은 각 관할권의 법에 따라 합법적이거나 그렇지 못하다고 판단되어질 수 있습니다. 이런 면에서 비트코인은 다른 툴이나 리소스와 다를 바 없고 각 나라의 다른 규제의 대상이 될 수 있습니다. 또한 제한적인 규정 때문에 비트코인 사용이 어려워질 수 있습니다. 이런 경우, 어느 정도의 유저들이 계속해서 이 기술을 사용할지는 가늠하기 힘듭니다. 비트코인의 금지를 택하는 정부는 국내 사업과 시장의 발전을 막게 될 것이고 혁신의 기회는 타 국가로 이전될 것입니다. 규제자들의 큰 과제는, 늘 그렇듯, 새로운 신흥 시장의 성장을 저해하지 않으면서 효율적인 해결책을 개발하는 것입니다.
비트코인과 세금은 어떤가요?
비트코인은 통화화폐가 아니면서 어떤 사법관할의 법정통화 또한 아닙니다. 그러나 납세의 의무는 자본의 종류에 연연하지 않습니다. 비트코인으로 인한 소득, 매출, 지불 급여, 자본 이익, 등의 여러가지 대해서 조세채무를 지게하는 여러 종류의 관할들과 사법들이 있습니다.
비트코인과 소비자 보호는 어떤가요?
비트코인은 사람들이 자신들만의 조건을 가지고 거래를 할 수 있도록 합니다. 각각의 사용자는 현찰의 그것과 비슷한 방식으로 지불을 하거나 받지만 또한 조금 더 복잡한 계약들을 맺을수도 있습니다. 다중서명은 특정 다수의 사람들이 서명을 해야만 네트워크가 거래를 인정하는 기능입니다. 이는 미래에 혁신적인 지불분쟁조정 서비스의 개발을 가능하게 할 것입니다. 이러한 서비스들은 거래 당사자들간의 분쟁이 있을시 제삼자가 당사자들의 돈에 손을 데지 않고서도 분쟁을 중재하는 것을 가능하게 할 것입니다. 현찰이나 다른 지불방법과는 다르게 비트코인은 항상 일어난 거래에 대한 공공증거를 남깁니다. 이는 잠재적으로 사업들이 부정행위를 저지르는 것을 방지할 수 있을 것입니다.
상인들은 일반적으로 좋은 평판을 토대로 사업을 하고 직원들에게 급여를 지불합니다. 그러나 고객들에 평판을 가늠하는데 필요한 정보는 부족한 것이 다반사입니다. 비트코인이 작동하는 원리는 개인과 사업 모두를 사기성 지불거절에서 보호해주며, 소비자가 믿지않고 싶은 상인과 거래를 할때에 더 많은 보호를 요구할 수 있는 선택권을 허락합니다.
경제
비트코인은 어떻게 만들어지나요?
새로운 비트코인들은 '채굴'이라고 하는 분권화된 그리고 경쟁적인 과정에 의해 만들어집니다. 이 과정은 또한 개인이 네트워크를 위해 채굴서비스를 한 것에 대한 보상 또한 포함합니다. 비트코인 채굴자들은 전문화된 하드웨어를 사용하여 네트워크의 거래들을 처리하며 이에 대한 보상으로 새로 생성된 비트코인들을 보상받습니다.
비트코인 프로토콜은 비트코인들을 고정된 속도로 생성하도록 설계되었습니다. 이는 비트코인 채굴을 아주 경쟁적인 사업으로 만듭니다. 더 많은 채굴자들이 네트워크에 참여할수록 채굴을 통해서 이윤을 창출하기가 어려워집니다. 결국 채굴자들은 효율을 높여 채굴비용을 낮추는 수밖에 없습니다. 어떤 중앙권력이나 개발자도 이렇게 시스템이 이윤을 창출해내는 방식을 변경하거나 통제할 수 있는 힘이 없습니다. 세계의 모든 비트코인 노드는 시스템의 규칙들에 어긋나는 모든 것들을 부정할 것입니다.
비트코인이 생성되는 속도는 예상 가능하게 감소됩니다. 매년 새로이 생성되는 비트코인의 수는 자동적으로 전년도의 반이 됩니다, 이는 첫 비트코인 처음 생성된 이래로, 비트코인의 한정된 총 갯수인, 2천 1백만 개의 비트코인이 만들어질 때까지 매년 반복될 것입니다. 이 때쯤이면, 비트코인 채굴은 수많은 극히 소액의 수수료만으로만 지탱될 것입니다.
왜 비트코인은 가치를 가지고 있죠?
비트코인은 돈의 한 형태로서 유용하기 때문에 가치가 있습니다. 비트코인은 돈의 특징들을 가지고 있습니다 (내구성, 휴대성, 대체가능성, 희소성, 가분성, 그리고 공인성). 비트코인의 이러한 특징들은 법정통화(통화화폐)라든지 다른 자본(금이나 은)과 같이 물리적인 특성에 의존하기보다 수학적인 특성에 의존합니다. 그러니까 비트코인은 수학을 토대로 한다는 것입니다. 이러한 특징들을 토대로한 돈이 가치를 가지기 위해 필요한 것은 오로지 신뢰와 수용입니다. 비트코인의 경우에는, 이미 비트코인을 수용하는 사용자, 사업가, 창업가들의 증가가 측정가능합니다. 다른 모든 화폐와 같이 비트코인의 가치는 비트코인을 지불수단으로서 받아들이는 사람들에서부터 직접적으로 오는 것입니다.
무엇이 비트코인의 가격을 결정하나요?
비트코인의 가격은 공급과 수요에 의해 정해집니다. 비트코인에 대한 수요가 증가하면, 비트코인의 가격도 증가합니다. 수요가 줄면 가격도 줄게됩니다. 오직 한정된 수의 비트코인만이 유통되고 있으며, 비트코인이 새로 생성되는 속도 또한 일정하게 그리고 예측이 가능하게 줄어듭니다. 이는 비트코인 가격이 안정되기 위해서는 이러한 인플레이션에 맞춰 수요가 증가해야된다는 뜻입니다. 아직 비트코인이 그 가능한 정도보다 작은 시장이기 때문에, 비트코인의 시가를 움직이기 위해서는 그다지 큰 돈이 필요하지 않습니다. 그래서 아직 비트코인의 가격변동이 심한 것입니다.
비트코인이 전혀 쓸모없어질 수도 있나요?
네. 역사는 실패하여 사용이 중지된 화폐들 예로 가득차 있습니다. 바이마르 공화국의 독일 마크가 그러했고, 더 근래에는 짐바브웨 달러가 있습니다. 이전의 화폐들은 주로 초인플레이션에 의해 망했습니다. 비트코인은 초인플레이션을 겪는 것이 불가능합니다. 그러나 언제나 기술적인 실패, 경쟁 화폐들, 그리고 정치적인 요인에 의해 망할 수 있을 것입니다. 기본적으로, 어떠한 화폐도 어려운 시기와 실패에서 완전히 자유로울 수 없는 것입니다. 태생 이래 지난 몇년간 비트코인은 지속적인 성장의 가능성을 보여왔으며 믿을만한 것이라는 것을 증명해 왔습니다. 그러나 그 누구도 비트코인의 미래를 장담할 수는 없는 것입니다.
비트코인은 버블인가요?
가격의 급속한 상승을 버블이라고 할 수는 없습니다. 갑작스럽게 하향세의 가격정정을 겪게 될 인위적으로 과대평가된 가격이 버블인 것입니다. 비트코인의 가격변동은 수백수천의 시장참가자들의 인간적인 선택들이 복합적으로 비트코인 가격을 발견해가면서 일어나는 것입니다. 비트코인에 대한 시장정서의 변화는 비트코인에 대한 자신감 저하, 비트코인 경제의 기본을 벗어난 가격과 가치의 차이, 투기를 돋구는 언론매체의 활동, 불확신한 미래에 대한 두려움, 그리고 항상 존재하는 무지한 욕망과 과열을 포함합니다.
비트코인은 폰지 사기인가요?
폰지 사기란 투자자들의 투자금액을 사업들에 투자하여 나온 이윤으로 투자자들을 보상하지 않고 투자자들의 투자원금으로 보상하는 사기투자활동입니다. 폰지 사기는 더 이상 활동에 참여하는 이들이 없을 때, 가장 나중에 참여한 투자자들의 투자금액을 희생으로 무너지도록 설계되었습니다.
비트코인은 중앙행정위가 존재하지 않는 자유 소프트웨어 프로젝트입니다. 고로 누구도 투자회수금에 대한 사기적인 정보유출 또는 주장을 할 수 있는 권리가 없습니다. 미화, 유로, 엔화와 같은 다른 주요 화폐들과 같이 환율을 자유롭게 변동하며 구매력이 보장되지 않습니다. 이는 비트코인 소유주들이 예측할 수 없이 돈을 잃거나 버는 변동성을 낳습니다. 투기를 넘어서, 비트코인은 수천의 사용자들과 사업자들이 사용하고 있고 경쟁적인 특징들을 가진 유용한 결제시스템입니다.
비트코인이 불공평하게 얼리 어답터들에게 이득을 가져다 주지 않나요?
어떤 얼리 어답터들은 큰 위기를 감수하고 많은 시간과 자본을 들여 거의 누구도 사용하지 않고 증명이 되지 않은 기술을 어렵게 획득한 것에 대한 보상으로 대량의 비트코인을 얻었습니다. 이들 중 대부분이 비트코인이 왠만큼의 가치가 생길 때까지 시장의 성장을 위해 대량의 비트코인을 소비했으며 큰 이윤을 남기지 않는 정도의 적은 양의 비트코인만을 구입했습니다. 비트코인의 가격이 상승할지 하락할지는 누구도 모릅니다. 이는 성공할지 실패하지 모르는 막 창업한 회사에 투자를 하는 것과 비슷한 것입니다. 비트코인은 아직 그 유년기에 있으며, 장기적인 안목을 가지고 설계되었습니다. 비트코인이 얼리 어답터들에게 이득이 되도록 치우쳐졌다고 하기에는 어렵습니다. 또한 오늘날의 사용자들이 내일의 얼리 어답터들이 될지 안될지도 모르는 것입니다.
한정된 비트코인의 양이 한계로 작용하지는 않을까요?
비트코인은 21백만 비트코인이 만들어질 고유함이 있습니다. 하지만, 비트와 같은 비트코인의 작은 하단부에 포함될 수 있는 거래사항들 때문에, 비트코인의 한계는 절대로 없을 것 입니다 - 1 비트코인에 1,000,000비트가 있습니다. 평균 거래 규모 감소처럼 미래에 요구되는 경우, 비트코인은 8 소수자리 (0.000 000 01)까지 나뉠 수 있으며 잠재적으로 유사합니다.
비트코인이 악성 디플레이션에 빠지지 않을까요?
악성 디플레이션 이론에서는 물가 하락이 예상되면 소비자들이 낮은 물가의 혜택을 받기 위해 구매를 미룰 것이라고 얘기합니다. 수요의 하락은 판매자들이 수요를 자극하기 위하여 가격을 낮추도록 유발하고, 이것이 문제를 악화시켜 경제 불황으로 이어집니다.
이런 경제 이론은 중앙은행장들이 인플레이션을 정당화하는데 사용되는 흔한 방법이지만, 항상 유효하지 않으며, 경제학자 사이에서도 많은 논란이 되어 왔습니다. 일례로 가정용 전자기기는 불황이 아니어도 가격이 계속 하락하는 경우가 있습니다. 이와 유사하게 비트코인의 가치는 계속 증가해 왔으며, 비트코인의 경제 규모 또한 그와 함께 급격이 성장해 왔습니다. 비트코인의 화폐가치와 규모는 2009년 0에서 시작되었고, 비트코인은 경제 이론이 틀린 경우도 있다는 것을 보여주는 반례가 되고 있습니다.
그럼에도 불구하고, 비트코인은 디플레이션 화폐가 되도록 설계되지 않았습니다. 정확히 말해, 비트코인은 초기 몇년간은 인플레이션되었다가 향후 몇년 안에 안정화되도록 설계되었습니다. 비트코인 유통량이 하락되는 유일한 시기는 사람들이 백업을 생성해 놓지 않고 부주의하게 지갑을 잃어버리는 경우에만 발생하게 됩니다. 안정적인 본원 통화와 안정적인 경제에서 화폐의 가치는 동일하게 유지됩니다.
변동성과 투기가 비트코인에 문제가 되지 않습니까?
이것은 닭이 먼저인가 달걀이 먼저인가의 상황입니다. 비트코인의 가격이 안정되기 위해서는 대규모의 경제가 발전해야 하고 더 많은 사업과 사용자가 필요합니다. 대규모의 경제가 발전하기 위해서는 사업과 사용자가 가격 안정을 추구해야 합니다.
다행이도 변동성이 결제시스템 또는 돈을 A지점에서 B지점으로 이동해주는 것과 같은 비트코인의 주요 장점들에 영향을 끼치지는 않습니다. 업체들이 지불받은 비트코인을 국내통화로 거의 즉시 환전할 수 있기 때문에, 비트코인의 가격변동의 영향을 받지 않을 수 있습니다. 이렇듯 비트코인이 많은 독특한 기능들과 특징들을 제공하기 때문에, 많은 사용자들이 비트코인을 선택합니다. 이러한 장점들이 가격변동이 한정될만큼 비트코인을 성숙시킬 것입니다.
만약 누군가 존재하는 모든 비트코인을 사들이면요?
현재까지 생성된 비트코인의 극히 일부분만이 현재 거래소에서 매매되고 있습니다. 비트코인 시장은 경쟁이 심합니다. 이는 수요와 공급에 의해 비트코인 가격이 변동한다는 뜻입니다. 또한, 앞으로 수십년간 새로운 비트코인들이 생성될 것입니다. 그렇기 때문에 아무리 단단히 결심한 사람이라도 존재하는 모든 비트코인을 소유하기는 어려울 것입니다. 그러나 이것은 비트코인 시장이 가격조작의 위험을 받지 않는다는 뜻은 아닙니다. 아직까지 비트코인의 시장 가격을 움직이는 것은 크나큰 자본이 필요하지 않습니다. 그래서 비트코인은 아직까지 변덕스러운 자산으로 남아있는 것입니다.
만약 누군가 더 좋은 디지털 화폐를 만들면 어떡하나요?
일어날 수 있는 일입니다. 아직까지는 비트코인이 분권화된 가상화폐중에서 가장 인기가 많습니다. 그러나 언제까지 그럴지는 모를 일입니다. 이미 비트코인에 영감을 받아 만들어진 대체통화들이 여럿 있습니다. 그러나 이러한 대체통화들이 심한 불확실성에도 불구하고 확립된 시장을 갖춘 비트코인을 대체하기까지는 어마어마한 발전과 성장이 있어야 할 것입니다. 또한 프로토콜의 근본적인 부분에 영향을 끼치지 않는 한, 비트코인 또한 다른 대체통화들의 이점들을 받아들임으로서 발전하고 개선될 수 있습니다.
거래
왜 제가 10분을 기다려야 하죠?
비트코인에서 지불을 받는 것은 거의 즉시 일어납니다. 그러나 지불받은 비트코인은 소비할 수 있기 이전에 우선은 네트워크가 당신의 거래를 블럭에 포함하는 승인절차를 밟아야 하는데, 이는 평균 10분 정도를 소요합니다. 여기서 승인이란 이 비트코인이 당신에게만 지불된 것이고 이제는 당신의 소유라는 것은 네트워크가 합의하는 것을 의미합니다. 한번 하나의 거래가 하나의 블럭에 포함되고 나면, 이 거래는 이후에 생성되는 모든 블럭들 아래 깔리게 됩니다. 이는 거래의 합의를 기하급수적으로 확고히하고 거래철회의 위험을 줄입니다. 언제 거래가 승인됐느냐를 판단하는 것은 각각의 사용자의 몫입니다. 6번 정도의 승인은 6개월 동안 신용카드거래를 기다리는 것과 비슷한 효과를 지닙니다.
거래 수수료는 얼마나 되나요?
대부분의 거래들은 수수료없이 처리될 수 있습니다. 그러나 빠른 거래 승인과 채굴자들의 수고비로서 작은 수수료를 자발적으로 내는 것이 권장됩니다. 수수료가 요구되는 경우에도, 수수료는 미화로 몇전 안되는 정도밖에 되지 않습니다. 당신의 비트코인 클라이언트가 내야하는 수수료를 추정계산해 줄 것입니다.
거래수수료는 사용자들이 거래를 과도하게 요구하여 네트워크가 과부하에 걸리는 것을 방지합니다. 수수료가 작동하는 정확한 원리는 아직 개발중에 있으며 시간이 지남에 따라 변화할 것입니다. 비트코인 거래수수료는 거래액과 무관하기 때문에 때로는 심히 저렴하거나 (1,000 BTC 전송에 0.0005 BTC 수수료) 또는 비싸 보일 수 있습니다 (0.02 BTC 지불에 0.004 BTC 수수료). 수수료 금액은 거래 반복횟수라든지 소모된 데이터와 같은 요인에 의해 결정됩니다. 예를 들어서, 거래액은 적으나 거래량이 많은 경우에는 수수료도 비쌀 것입니다. 이는 레스토랑에서 동전만을 사용하여 음식값을 지불하는 것과 같은 이치입니다. 또한 금액은 적으나 소비가 심히 잦은 경우에도 수수료가 높게 나올 것입니다. 그러나 당신의 거래활동이 정상적인 범위내로 유지된다면, 수수료 또한 낮게 유지될 것입니다.
만약 제 컴퓨터가 꺼져있을때 비트코인을 받으면 어떡하나요?
문제가 되지 않습니다. 받은 비트코인은 당신이 이 다음에 지갑 앱을 열었을 때 보일 것입니다. 비트코인은 당신의 컴퓨터의 소프트웨어가 받는 것이 아닙니다. 네트워크에 있는 모든 기기들간에 통용되는 공공회계원장에 기록되는 것입니다. 만일 당신의 클라이언트가 오작동하는 동안에 비트코인이 당신에게 지불됐다면, 나중에 클라이언트를 재설치하고, 네트워크의 모든 거래내역을 업데이트 받은 연후에 확인하더라도, 방금 지불받은 것과 같이 그 내역을 확인할 수 있을 것입니다. 지갑이 필요한 주요 이유는 비트코인을 소비하기 위해서입니다.
"동기화"는 무엇을 뜻하고 왜 이렇게 오래 걸리나요?
긴 시간의 동기화는 Bitcoin Core와 같은 풀 노드에서만 필요한 것입니다. 기술적으로 말하자면, 동기화는 네트워크내의 모든 거래내역을 다운로드하고 확인하는 과정입니다. 어떤 클라이언트들에서는 당신의 사용가능한 비트코인 잔액을 계산하기 위해서는, 당신의 모든 이전 거래들을 확인해야 합니다. 이는 블럭 체인의 전체를 확인해야 하는 작업이기에 적지않은 용량과 대역폭을 소모할 것입니다. 비트코인이 안전하게 유지되려면, 충분히 많은 이들이 거래내역을 확인하고 전달하는 역할을 갖고 있는 풀 노드 크라이언트를 가동유지해야 합니다.
채굴
비트코인 채굴은 무엇인가요?
채굴은 거래를 처리하고, 네트워크를 안전하게 보호하며, 시스템내에 있는 모두의 일체 동기화를 유지하기 위해 컴퓨터의 연산능력을 사용하는 과정입니다. 이는 비트코인 데이터 센터와 같이 이해할 수 있습니다. 다만, 모든 국가에서 활동하는 채굴자들과 그 누구도 네트워크에 대한 지배권을 가지고 있지 않도록 하여 완전히 분권화되도록 설계되었다는 점을 제외하고는 말입니다. 이 과정은 금 채굴에 빗대어 "채굴"이라고 불리는데 이는 이 과정이 새로운 비트코인을 발행하는 일시적인 메커니즘이기도 하기 때문입니다. 하지만, 금 채굴과는 다르게 비트코인 채굴은 안전한 지불 네트워크를 운영하기 위해 필요한 유용한 서비스에 대한 대가로 보상을 제공합니다. 채굴은 마지막 비트코인이 발행된 후에도 필요할 것입니다.
비트코인 채굴은 어떻게 작동하나요?
누구나 전문화된 하드웨어를 통해 소프트웨어를 실행함으로써 비트코인 채굴자가 될 수 있습니다. 채굴 소프트웨어는 피어투피어 네트워크를 통해 보내진 거래들을 확인하고 이 거래들을 처리하고 승인하기 위해 적절한 작업을 수행합니다. 비트코인 채굴자들이 이런 일을 하는 이유는 그들이 사용자들이 더 빠른 거래 처리를 위해 지불하는 거래 수수료와 정해진 공식에 따라 발행된 새 비트코인을 벌어들일 수 있기 때문입니다.
새로운 거래들이 승인되기 위해서는, 거래내역들이 수학연산입증과 함께 하나의 블럭에 포함되어야 합니다. 이러한 수학연산입증들은 초당 십억개의 계산들을 해야만 되기 때문에 생성하기가 어렵습니다. 이는 채굴자들이 수수료를 보상받기 이전에, 수학연산을 해야하고, 이를 거래내역과 함께 블럭에 포함시켜야 하고, 그리고 네트워크의 승인을 받아야 한다는 뜻입니다. 더 많은 사람들이 채굴을 시작하면서, 네트워크안에서 적합한 블럭을 찾는 것이 10분으로 유지되기 위해서 자동적으로 하나의 블럭을 찾는 것이 매우 어려워졌습니다. 결론적으로 채굴은 매우 경쟁적인 사업이며 고로 한 개인 채굴자가 블럭 체인에 포함된 것들을 통제할 수는 없는 것입니다.
연산입증은 또한 이전에 블럭 체인에 생성된 블럭들의 순서에 의존하도록 설계되었습니다. 이는 이전의 거래들을 철회하는 것을 기하급수적으로 어렵게 하는데 이는 하나의 거래를 철회하기 위해서는 이전에 존재하는 모든 거래들에 대한 수학연산들을 다시 계산해야 하기 때문입니다. 두 개의 블럭들을 동시에 찾게되는 경우에, 채굴자들은 첫번째 블럭에 대한 연산입증은 시작하고 그 다음 블럭을 찾자마자 사슬이 가장 긴 블럭으로 연산입증을 전환합니다. 이는 채굴이 처리능력을 토대로 한 세계적인 합의들을 보호하고 유지하는 것을 가능하게 합니다.
비트코인 채굴자들은 자신들의 보상을 증가시키는 부정행위를 할 수 없을 뿐만 아니라 비트코인 네트워크를 변질시킬 수 있는 사기 거래를 처리할 수도 없습니다. 이는 모든 비트코인 노드가 비트코인 프로토콜 규칙에 따라 올바르지 않은 데이터를 포함하는 어떠한 블럭도 거부하기 때문입니다. 따라서, 네트워크는 채굴자 모두가 신뢰될 수 있는 것이 아닌 경우에도 여전히 안전합니다.
비트코인 채굴은 에너지 낭비 아닌가요?
결제시스템을 운용하고 보호하는데 에너지를 사용하는 것은 에너지 낭비가 아닙니다. 다른 결제시스템들과 같이, 비트코인의 사용은 처리비용을 포함합니다. 현재 사회에 필수적인 은행, 신용카드, 그리고 장갑차량과 같은 금융시스템의 기능들은 모두 엄청난 양의 에너지를 사용하고 있습니다. 그러나 이들은 비트코인과 마찬가지로 그 총 에너지 사용량이 투명하지도 않고 또 쉽게 측정할 수도 없습니다.
비트코인 채굴은 시간이 지날수록 더 최적화가 이루어지고 전문화된 장비가 에너지를 덜 소비하도록 설계되어 있습니다. 또한, 채굴 운영비는 계속해서 수요에 비례할 것입니다. 비트코인 채굴이 지나치게 경쟁적이 되고 수익이 떨어졌을 때, 일부 채굴자들은 활동을 중단하기로 결정합니다. 더욱이, 채굴에 소비된 모든 에너지는 결국 열로 변화되고, 가장 수익성이 높은 채굴자들은 이 열을 잘 활용한 사람들일 것입니다. 최고로 효율적인 채굴 네트워크는 사실상 어떠한 추가 에너지도 소비하지 않는 네트워크입니다. 이것이 이상적이지만, 채굴 경제는 채굴자 개개인이 이를 위해 힘쓰도록 되어있습니다.
채굴은 어떻게 비트코인을 안전하게 보호하는 데 기여하나요?
채굴은 경쟁적 복권과 같은 것을 생성하여 누구도 연속하여 새 거래 블럭을 블럭 체인에 더하기 매우 어렵게 합니다. 이것은 어떠한 개인도 특정 거래를 금지할 수 있는 권한을 취득하지 못하도록 방지하여 네트워크의 중립성을 보호합니다. 이것은 또한 어떠한 개인도 자신의 지출을 되돌리기 위해 블럭 체인의 일부를 대체 - 이는 다른 사용자들을 사취하는데 이용될 수 있습니다 - 하지 못하게 방지합니다. 채굴은 과거 거래를 파기하기 위해서 이 거래 후에 오는 모든 블럭의 재기록을 요구함으로써 과거 거래의 파기를 기하급수적으로 어렵게 만듭니다.
채굴을 시작하기 위해서 무엇이 필요한가요?
비트코인의 초기에는 누구나 컴퓨터에 CPU -중앙 처리 장치 -가 있으면 새로운 블럭을 찾을 수 있었습니다. 그러나 점점 더 많은 사람들이 채굴을 시작함으로 인해서 오늘날에는 전문화된 하드웨어를 소유하지 않고서는 새로운 블럭을 찾는 것이 굉장히 어려운 고비용 활동이 되었습니다. 더 자세한 사항은 BitcoinMining.com을 참고하세요.
보안
비트코인은 안전한가요?
비트코인 기술 - 프로토콜과 암호 작성술 -은 강력한 보안성에 있어 든든한 성과를 보여왔습니다. 비트코인 네트워크는 아마 세계에서 가장 널리 유통된 컴퓨터 프로젝트일 것입니다. 비트코인의 가장 큰 취약점은 사용자의 실수일 것입니다. 비트코인 지갑에 저장되어 있는 필수적인 개인 키들을 실수로 잃어버리거나 삭제할 수 있기 때문입니다. 이는 전자로 저장된 물리적인 현찰과도 비슷합니다. 다행이도 사용자들은 자신들의 돈을 보호하기 위해서 안전한 사용법들을 실천하거나, 충분한 보안과 보험을 제공하는 좋은 서비스를 사용할 수 있습니다.
과거에 비트코인이 해킹당한 적은 없나요?
프로토콜의 규칙들과 비트코인을 위한 암호 작성술들은 비트코인의 태생이래로 아직까지 문제없이 작동하고 있습니다. 이는 비트코인의 개념이 잘 설계되었다는 의미일 것입니다. 그러나 여러 소프트웨어를 시행하면서 보안상의 취약점들이 발견되어 왔으며 또 고쳐져 왔습니다. 다른 형태의 소프트웨어들과 같이, 비트코인의 보안은 그 취약점들이 얼마나 빨리 발견되고 고쳐지느냐에 달려 있습니다. 더 많은 취약점들이 발견될수록 비트코인 더 성숙해져 갈 것입니다.
여러 거래소와 사업에서 발생한 절도와 보안침입에 대한 오해들이 많습니다. 불행한 사건들임에도 불구하고 그 어떤 경우에도 비트코인 자체가 해킹당하거나 비트코인 자체에 태생적인 결함이 있다는 의미는 아닙니다. 은행에 강도가 있다고 해서 달러가 위태롭다는 뜻이 아닌 것 같이 말입니다. 그러나 더 완전하고 직관력이 있는 보안솔루션이 개발, 실천되야 한다는 것은 정확합니다. 일반적인 절도와 피해를 줄이고 사용자들의 돈을 보호하기 위해서는 말입니다. 지난 몇년간 그러한 보안기능들이 빠르게 개발되어왔습니다. 이는 지갑 인크립션, 오프라인 지갑, 하드웨어 지갑, 그리고 다중서명거래들을 포함합니다.
사용자들이 비트코인에 맞서 공모할 수도 있나요?
비트코인 프로토콜을 그렇게 쉽게 바꾸는 것은 가능하지 않습니다. 같은 규칙을 준수하지 않는 어떤 비트코인 클라이언트도 그들만의 규칙을 다른 사용자에게 강요할 수 없습니다. 현재 설계서에 따라, 같은 블럭 체인에서 이중 사용은 가능하지 않으며 유효한 서명 없이 비트코인을 쓰는 것 또한 가능하지 않습니다. 그러므로 난데없이 제어되지 않는 양의 비트코인을 생성한다든지, 다른 사용자들의 자금을 사용한다든지, 네트워크를 변질시킨다든지 하는 것은 가능하지 않으며 이들과 비슷한 어떠한 것도 마찬가지입니다.
그러나 다수결 원칙에 따라 다수의 채굴자들이 독단적으로 최근 거래들을 막거나 철회할 수 있습니다. 또한 이들은 이렇게 프로토콜의 변화를 입법하도록 압력을 가할수도 있습니다. 비트코인이 모든 사용자들간의 합의가 있어야만 작동하기 때문에, 프로토콜을 변경하는 것은 매우 어려운 일일 것이며, 소수의 사용자들이 선택의 여지가 없을 만큼 압도적인 다수가 변화를 원하여만 가능할 것입니다. 상식적으로 보았을 때 비트코인 사용자들의 자신들의 돈에 위험이 될만한 변화를 받아들이기를 원치는 않을 것입니다.
비트코인은 양자 컴퓨터에 취약한가요?
그렇습니다. 전통적인 은행시스템과 같은 대부분의 암호 작성술에 의존하는 시스템들이 그렇습니다. 그러나 아직은 양자 컴퓨터가 존재하지 않으며, 이는 한동안 그러할 것입니다. 양자 컴퓨터가 비트코인에 임박한 위혐이 되었을 경우에는 프로토콜이 양자 알고리즘을 입양한 업그레이드를 하면 될 것입니다. 이 업데이트가 가질 중요성을 고려했을 때, 이는 아마 많은 개발자들에 의해 단단히 검토될 것이고 후에 비트코인 사용자들에 의해 받아들여질 것입니다.
출처 : 비트코인.org
원도우를 설치 하실 때 어떤 방식으로 설치를 해야하나 많이 고민하시는데요.
예전에는 CD로 윈도우 부팅 CD를 만들서 설치를 했습니다.
하지만 요즘은 CD-ROM이 없는 PC들도 많고 윈도우 설치용 CD를 만들고 보관에도 불편함이있어서
USB를 윈도우 설치 부팅 디스크로 많이 활용 합니다.
그래서 USB에 윈도우10 ISO 이미지를 넣어서 부팅 디스크를 만드는 방법에 대해서 알아 보도록 하겠습니다.
윈도우 10 USB로 설치하는데 20~30분이면 충분합니다.
그림에 보시는것처럼 UltraISO 프로그램을 이용해서 만들면 금방 쉽게 만들 수 있습니다.
먼저 네이버에서 ULTRAISO를 검색해서 울트라ISO를 다운 받아서 설치를 합니다.
그림에서처럼 다음 버튼을 계속 누르고 설치를 완료 합니다.
울트라 에디트를 실행하면 화면과 같이 나옵니다.
밑에 프레임에서 ISO가 위치한 곳으로 이동을해서 읽어주면 윗 프레임에 해당 ISO의 파일들이 나옵니다.
그리고 부팅 - 디스크 이미지 기록을 실행 합니다.
위와 같이 계속 진행하시겠습니까? 라는 경고창이 나와도 무시하고 진행
쓰기 버튼을 클릭해주면 아래 화면처름 이미지를 USB에 넣기 시작합니다
"성곡적으로 굽기 완료!"라는 메시지가 나오면 완료가 된 것입니다.
USB드라이버로가서 USB를 읽어보면 그림과 같이 파일이 들어간 것을 보실수 있습니다.
이 후 부팅모드에서 USB부팅모드로 세팅 후 부팅을 하면 윈도우10 설치 화면으로 바로 넘어 가실 수 있습니다.
다른 이미지 파일들도 울트라ISO를 활용해서 그대로 따라하면 설치용 USB로 만드실 수 있습니다.
도움이 되셨다면 공감 한방 쿠욱~ 부탁드리겠습니다.
'컴퓨터일반' 카테고리의 다른 글
SSD 윈도우 10 설치 오류 해결!! (11) | 2017.02.20 |
---|---|
클라우드란? (0) | 2017.01.30 |
안녕하세요.
현재 사용하고있는 SSD 250G는 용량이 작은거 같아서 발렌타인데이 나를 위한 선물로 MX300 750G를 구매하였습니다.
이전에 SSD 250G에 윈도우를 설치할때 간편하게 설치 하였기에 이번에도 문제없이 설치 할꺼라고 생각했는데..
역시 나 첫번째 설치화면부터 저를 예상이 비참하게 어긋났네요.
보시는것 처럼 드라이브 0 할당되지 않은 공간 내용과 함께 "이 드라이브에 Windows를 설치할 수 없습니다."라는 메시지가 뜨네요.
아~ 최초SSD를 만들면서 파티션을 만들어주지 않아서 그렇구나~!! 라고 생각하고 다시 원래 SSD로 부팅해서
제어판 - 관리도구 - 컴퓨터 관리 화면에 들어가서 사진과 같이 파티션을 만들었습니다..
드디어 WINDOS10을 설치 할 수 있겠구나 라고 생각하고 다시 부팅을 해서 설치를 할려고했더니..
이런 아래와같이
"새 파티션을 만들거나 기존 파티션을 찾을 수 없습니다. 자세한 내용은 설치 로그 파일을 참조하세요."
라는 메시지가 뜨고 다음으로 넘어가지 않습니다..
이때부터 WINDOWS10 설치와 저와의 본격적인 혈투가 시작 되었습니다. ㅜ
마이크론에서 제공하는 프로그램도 사용해보고 별의 별의 방법을 다 해 봤는데도 윈도우 설치가 안되었습니다.
인터넷을 검색을 하고 프롬프트창에 들어가서 새로 구입한 SSD 드라이버를 MBR 시스템으로도 변경해보고 GPT시스템으로도 변경 해봤는데 오류 메시지만 뜰 뿐 안되더군요. ㅜ
심지어 WINDOWS USB를 뺐다가 다시 꽂으면 된다는 해결책도있었는데 그것도 따라 해봤더니 안되더라구요. ㅜ
해결책은 정말 어의없는 곳에 있었습니다.
아래 사진과 같이 파티션을 다 삭제를 하였더니 윈도우가 바로 설치가 되더라구요.
3시간동안 열심히 찾았는데 해결책은 너무 허무했네요..
여러분들도 새로 구입한 SSD에서 WINDOWS10 설치를 하다가 저처럼 기존파티션을 찾을 수 없다는 에러가 메시지가 뜨면 겁먹지말고
파티션 전부 삭제를 해버리세요~ 그럼 바로 설치화면으로 넘어가 실 수 있을 껍니다.
지금은 용량에 만족하면서 아주 잘 사용하고 있습니다. 역시 750G의 대용량과 SSD의 속도가 만나니 만족도가 예전의 2배는 높아진거 같습니다.
그럼.. 이만 ~~ㅎㅎ
도움이 되셨다면 공감 한방 쿠욱~ 부탁드립니다.^^
'컴퓨터일반' 카테고리의 다른 글
윈도우10 설치 USB 만들기 (0) | 2017.03.10 |
---|---|
클라우드란? (0) | 2017.01.30 |
안녕하세요.
얼마전 SSD를 MX300 750G로 새로 구매 후 윈도우를 새로 깔고 오랜만에 OllyDbg를 실행시켰더니
(Themida) 동작중인 디버거가 발견 되었습니다. 디버거를 종료 후 사용하시기 바랍니다.
이런 메시지가 뜨더군요.. 생전 처음 겪는 일..
아마 리버싱에 처음 입문하시는 분들 중에 이런 메시지가 출력도 분들도 많을꺼 같아서 제가 해결한 방법을 올려 봅니다.
구글에서검색을 해도 바로 이상한 검색 결과만 뜨거나 해결방법대로 따라했는데도 경고메시지는 계속 출력이 되더군요.
자력으로 해결해보기로 하고 Process Explorer 를 실행시켜서 찾아봤더니 유달리 의심되는 녀석이 하나 보이 더군요.
여기 delfino.exe 설명에..Wizvera Delino라고 적혀있는데 듣도 보도 못한 듣보잡...
일단 삭제해도 대세에는 지장이 없는 프로그램인거 같지만 혹시나 몰라서 검색을 해봤더니..
역시 나.... 컴퓨터 자원만 처묵처묵하는 프로그램이라는 것과 공인증서 관련 프로그램인데 삭제해도 지장없다는
결과가 있더군요.
은행 공인인증서 프로그램을 일괄 설치할때 WIZVERA로 시작하는 프로그램을 다운받아 통합 설치를 하게 되는데 아마도 거기서 파생된 프로그램인거 같습니다.
아마 디버깅 프로그램도 피싱이나 키로거 같은데 악용될 소지가 있어서 프로그램에서 경고창을 띄우는거 같은데 학습용으로 디버깅 툴을 사용하는 저에게는 경고창은 그저 귀찮을 뿐이라서 해당 폴더로 들어가서 프로그램을 삭제를 했습니다.
위치 : C:\Program Files (x86)\Wizvera\Delfino-G3
삭제 했더니 아래와 같이 경고창이 뜨지 않고 잘 OllyDbg가 잘 실행되는걸 확인했습니다.
도움이 되셨다면 공감 한방 쿠욱~ 부탁합니다.
'Reverse Engineering' 카테고리의 다른 글
리틀엔디언 VS 빅엔디언 (0) | 2017.01.30 |
---|---|
어셈블리어(Assembly) 기초 (5) | 2017.01.29 |
RVA to RAW(PE File Format) (0) | 2017.01.21 |
Hello World 디버깅 실습 (0) | 2017.01.21 |
Crackme 두번째 관문 (0) | 2017.01.19 |
클라우드란?
클라우드(Cloud)의 의미는 컴퓨터 통신망이 구름과 같은 것에 싸여 안이 보이지 않고, 일반 사용자는 이 복잡한 내부를 굳이 알 필요도 없이 어디
에서나 구름 속으로 손을 집어넣어 자기가 원하는 작업을 할 수 있다는 것이다. 이른바 동일한 체험을, 인터넷이 연결된 어디에서나 보장해주는
것.
인터넷 상의 유틸리티 데이터 서버에 프로그램을 두고 그때 그때 컴퓨터나 휴대폰 등에 불러와서 사용하는 웹에 기반한 소프트웨어 서비스이다.
클라우드 컴퓨팅의 정의는 개인이 가진 단말기를 통해서는 주로 입/출력 작업만 이루어지고, 정보분석 및 처리, 저장, 관리, 유통 등의 작업은 클라
우드라고 불리는 제3의 공간에서 이루어지는 컴퓨팅 시스템 형태라고 할 수 있다.
클라우드 컴퓨팅은 IT 관련된 기능들이 서비스 형태로 제공되는 컴퓨팅 스타일이다.
사용자들은 지원하는 기술 인프라스트럭처에 대한 전문 지식이 없거나 제어할 줄 몰라도 인터넷으로부터 서비스를 이용할 수 있다.
IEEE 에서는 "정보가 인터넷 상의 서버에 영구적으로 저장되고 데스크탑이나 테이블 컴퓨터, 노트북, 벽걸이 컴퓨터, 휴대용 기기 등과 같은 클라
이언트에는 일시적으로 보관되는 패러다임이다." 라고 말한다.
일반적인 클라우드 컴퓨팅에서 소프트웨어와 데이터는 서버에 저장된다.
클라우드 컴퓨팅은 웹 2.0, SaaS(software as a service)와 같이 최근 잘 알려진 기술 경향들과 연관성을 가지는 일반화된 개념이다.
이들 개념들의 공통점은 사용자들의 컴퓨팅 요구를 만족시키기 위해 인터넷을 이용한다는 사실이다. 예로서 구글 앱스(Google Apps)가 있다.
이 외에도 IaaS, PaaS 등의 개념이 있다.
IaaS(Infrastructure as a Service): 서비스로써의 인프라라는 뜻으로, AWS에서 제공하는 EC2가 대표적인 예이다. 이는 단순히 서버 등의 자원을
제공해 주면서 사용자가 디바이스에 제약없이 데이터에 접근할 수 있도록 해준다.
PaaS(Platform as a Service): 서비스로써의 플랫폼이라는 뜻으로, 사용자(개발자)가 소프트웨어 개발을 할 수 있는 환경을 제공해 준다. 구글의
APP 엔진, Heroku 등이 대표적인 예다.
SaaS(Software as a Service): 서비스로써의 소프트웨어라는 뜻으로, drop box, google docs 등 과 같은 것을 말한다.
클라우드 컴퓨팅의 개념은 1965년 미국의 컴퓨터 학자인 존 매카시가 "컴퓨팅 환경은 공공 시설을 쓰는 것과도 같을 것" 이라는 개념을 제시한데
에서 유래하였다. 1993년부터는 이미 클라우드라는 용어가 거대한 규모의 ATM을 지칭하는 데 쓰였다. General Magic라는 회사는 1995년 3월부
터 AT&T와 다른 여러 통신사들과 제휴를 맺고 클라우드 컴퓨팅 서비스를 최초로 시작했다. 하지만 이 시기는 소비자 중심의 웹 기반이 형성되기
전의 일이었기 때문에 클라우드 컴퓨팅 사업은 당연히 실패했다. 그러나 10년이 지난 2005년에서야 클라우드 컴퓨팅이라는 단어가 널리 퍼지기
시작했다. 하지만 2005년 당시 클라우드 컴퓨팅의 대부분의 내용들은 SaaS에 집중되어 있었다. 2007년까지는 SaaS에 집중되어 있었지만 2008년
부터는 더이상 SaaS에만 집중되어 있지 않으며, IaaS, PaaS로 그 영역을 넓혀가게 되었다.
장점[편집]
초기 구입 비용과 비용 지출이 적으며 휴대성이 높다.
컴퓨터 가용율이 높다. 이러한 높은 가용율은 그린 IT 전략과도 일치한다.
다양한 기기를 단말기로 사용하는 것이 가능하며 서비스를 통한 일관성 있는 사용자 환경을 구현할 수 있다.
사용자의 데이터를 신뢰성 높은 서버에 보관함으로써 안전하게 보관 할 수 있다.
전문적인 하드웨어에 대한 지식 없이 쉽게 사용 가능하다.
단점[편집]
서버가 공격 당하면 개인정보가 유출될 수 있다.
재해에 서버의 데이터가 손상되면, 미리 백업하지 않은 정보는 되살리지 못하는 경우도 있다.
사용자가 원하는 애플리케이션을 설치하는 데에 제약이 심하거나 새로운 애플리케이션을 지원하지 않는다.
통신환경이 열악하면 서비스 받기 힘들다.
개별 정보가 물리적으로 어디에 위치하고 있는지 파악할 수 없다
정확한 개념이 의외로 복잡한데, 대부분의 작업을 온라인에 분산되어 존재하는 데이터 센터(Data Center, 이하 클라우드)에 맡겨 수행하고, 사용
자의 컴퓨터는 클라우드에 접속하여 상호작용하는 단말기 역할만 하는 것이다. 이 때문에 모든 데이터와 연산 자원이 클라우드 안에만 존재하게
되며, 이 자원을 유연하게 관리하기 위해 가상화 기술 등이 투입되게 된다.
또한 인터넷 서비스 운영자의 입장에서는 직접 서버를 운영하는 대신에, 구글이나 아마존닷컴, 마소프트 등의 대기업의 클라우드 자원을 빌려 서
비스를 운영하는 편이 차후에 서비스의 규모가 커졌을 때 대처하기 편하다. 서버 세팅/확장 등은 신경쓰지 말고 서비스 운영 자체에만 집중할 수
있게 해 준다. 컴퓨팅 자원을 마치 전기 끌어다 쓰듯이 쓸 수 있도록 해 준다고 보면 된다.
또한 이러한 서비스를 이용한 실상품으로는 구글에서 추진하고 있는 크롬북이 대표적이다. 크롬북은 컴퓨터 전원을 켜면 크롬 브라우저 하나만
[4] 덩그러니 실행된다. 다른 프로그램은 어떻게 쓰냐고? 클라우드에 접속하면 문서도구, 그래픽, 게임을 불문한 모든 작업이 가능하다. 컴퓨터에
아무것도 저장하지 않은 상태로 오직 클라우드 내에서만 구글 크롬 스토어에서 취급되는 앱들을 비롯한 다양한 클라우드 앱을 이용할 수 있으므
로 굳이 프로그램을 깔아서 쓸 필요가 없다는 컨셉이다. 다만 크롬북은 모든 작업을 웹과 클라우드상에서 처리하다 보니 인터넷이 없으면 말 그대
로 깡통이 된다는 치명적인 단점이 있다.
애플의 맥북 에어도 어떻게 보면 비슷한데, iCloud, 드롭박스 등의 여러 클라우드 서비스 등장으로 굳이 하드 탑재로 용량을 늘릴 필요가 없어졌기
에 맥북 에어의 경우 두께를 위해 용량을 희생하고 그 두께의 거의 모든 부분이 배터리 확충에 치중되고 있다. 저장 용량이 중요하지 않고 되려 사
용자의 편의성과 직결되어 있는 배터리 양이 더 중요하다는 것이다. 다만 크롬북과는 달리 인터넷에 연결되지 않아도 웬만한 건 다 할 수 있기 때
문에 아래에 서술된 클라우드의 단점 역시 어느 정도 극복할 수 있는 형태라는 결정적 차이점을 가진다.
그리드 컴퓨팅과는 다르다, 그리드 컴퓨팅과는!
왠지 그리드 컴퓨팅이라는 개념과 혼동하는 경우가 많은데, 분산처리라는 점에서는 같으나, 다음 면에서 큰 차이를 보이고 있다.
그리드 컴퓨팅은 '분산'에, 클라우드 컴퓨팅은 '중앙집중'에 초점이 맞춰져 있다. 실제로 그리드 컴퓨팅은 흩어져 있는 컴퓨터의 여유자원을 인터
넷으로 합쳐서 특정 프로그램을 돌리는 것이고, 클라우드 컴퓨팅은 같은 내부 네트워크 내 컴퓨터들의 자원을 합쳐 특정 프로그램들을 돌리는 것
이다.
클라우드 컴퓨팅은 협업 처럼 한 그룹에 있는 애들이 같이 으쌰으쌰해서 파워를 합치는 것 이고,
그리드 컴퓨팅은 군대처럼 지가 해야될 일을 다른 애들한테 짬시키는 것 이다.
여기까지만 들으면 거의 같지 않나 싶지만.. 클라우드 컴퓨팅은 자기 내부 그룹에서 하는 일이고, 그리드 컴퓨팅은 얼굴도 모르는 애들한테 막 시
키고 난리를 친다.
그리드 컴퓨팅은 자원 자체가 흩어져 있기 때문에 중간에 해커가 개입될 수 있지만, 클라우드 컴퓨팅은 자원이 중앙집중 및 가상화되어 있기 때문
에 이런 일이 불가능하다. 클라우드를 해킹하려면 어차피 네트워크 전체를 침입해야 하는데, 중간에 방화벽에 막히기라도 하면 말짱 도루묵. 또한
클라우드 컴퓨팅은 용량과 성능의 제약에서 벗어나게 되므로 운영체제 레벨의 보안 처리와 함께 예외처리 떡칠을 해버리게 되면 암호 문제나 내
부적인 문제를 제외한 모든 침입면에서는 해커들이 떡실신 당하게 된다. 물리적으로 데이터 센터 내부에 직접 접속하거나 협조를 얻으면 몰라도,
최소한 단말기로 하려는 원격 소프트웨어 해킹 시도는 불가능에 가까울 것이다.
또한 슈퍼컴퓨터와도 혼동하는 일이 있는데, 슈퍼컴퓨터는 전용 OS를 이용하여 모든 노드를 하나로 묶는 반면 클라우드 컴퓨팅은 각 노드마다
OS가 따로 깔리고 상호간 처리는 클라우드 미들웨어 간의 네트워크 전송으로 해결한다. 물론 슈퍼컴퓨터를 여러대 연결해서 그걸 클라우드 컴퓨
팅으로 돌리는 것도 가능하고, 외부에서 보면 슈퍼컴퓨팅이나 클라우드 컴퓨팅이나 그게 그거다.
2000년대 들면서 급부상한 IT떡밥 중 하나이나, 정작 통신 보안쪽으로는 크게 골머리다. 클라우드 컴퓨팅 환경에서는 사용자의 개인 정보가 클라
우드에 저장되면 사실상 사용자가 그 정보의 위치를 통제할 수 없기 때문.[5] 이를 리처드 스톨먼이 딱 한 단어, 덫(Trap)으로 지적한 바 있다. 덧붙
여 사실상의 처리를 사용자의 시스템에서 처리하지 않기 때문에, 통상 시스템에 비해 트래픽이 증가하게 된다. 인터넷 종량제라도 시행했다간...컴
퓨터를 켜는 거 자체가 요금 그나마 대부분의 트래픽이 클라우드 내에서 처리될 수 있다는 점에선 그리드 컴퓨팅에 비해 약과. 그리드 컴퓨팅의
경우 처리되는 모든 트래픽을 떠안아야 한다.
여하튼 가벼움이 가장 큰 장점이고, 보안 전문가들이 공밀레가 되는 대신에 일반 사용자는 보안에 그다지 신경을 쓸 필요도 없기에 MS의
Microsoft Azure를 필두로 여러 곳에서 적극 도입이 진행 중. 아파치 재단의 프로젝트인 Hadoop 및 관련 프로젝트들은 이걸 오픈소스로 구현한
것이다.
클라우드 컴퓨팅에는 개인목적으로 저장해둔 데이터들이 사용자 본인이 아무리 관리를 철저하게 한다 해도 하루아침에 사라지거나, 전혀 상관없
는 제3자에게 공개될 수 있는 매우 치명적인 단점이 존재한다. 이러한 문제가 발생하는 원인은 전적으로 당신의 데이터를 관리하는 회사에게 있
다. 즉 클라우드를 관리하는 회사가 망하거나, 변심하거나, 관리를 소홀히 한다면, 음모론처럼 들리는 이 단점이 곧바로 현실이 된다.
관리소홀로 인해 데이터가 통째로 증발한 사례는 이미 현실에서 실현되었다. 일본 퍼스트서버 사고가 그것이다. 클라우드 서비스 업체가 5698개
기업의 데이터를 몽땅 날려먹은 초대형 사고가 발생하였다.
차라리 망하면 다행인데 더 끔찍한 비극은 클라우드를 관리하는 회사가 임의로 사용자의 정보를 제3자에게 제공하는 경우다.
구름이란 의미답게 정의도 뜬구름 잡는 듯한 것이 많다. 용어 자체가 굉장히 넓은 범위를 포함하고 있으며, 사람마다 정의하는 의미가 전부 다르
다. 실제로 관련 서적을 봐도, 기본적인 내용은 다 같을지라도 세부적인 정의가 전부 다 다르다.
K모 대학에서 관련된 강의를 했었던 기업에서 실무를 담당하고 있는 누군가의 말을 빌리자면, "누군가와 클라우드 컴퓨팅에 대해 토의할 일이 있
으면 시간의 80%를 그 사람이 생각하는 클라우드와, 내가 생각하는 클라우드를 비교하는데 쓴다"라고 했을 정도로 사람마다, 기업마다, 부서마
다 생각하는 게 다르다.
도움이 되셨다면 공감 한방 쿠욱~ 부탁드립니다.^^
'컴퓨터일반' 카테고리의 다른 글
윈도우10 설치 USB 만들기 (0) | 2017.03.10 |
---|---|
SSD 윈도우 10 설치 오류 해결!! (11) | 2017.02.20 |
엔디언이란 무엇인가?
엔디언(Endianness)은 컴퓨터의 메모리와 같은 1차원의 공간에 여러 개의 연속된 대상을 배열하는 방법을 뜻하며, 바이트를 배열하는 방법을 특히 바이트 순서(Byte order)라 한다.
엔디언은 보통 큰 단위가 앞에 나오는 빅 엔디언(Big-endian)과 작은 단위가 앞에 나오는 리틀 엔디언(Little-endian)으로 나눌 수 있으며, 두 경우에 속하지 않거나 둘을 모두 지원하는 것을 미들 엔디언(Middle-endian)이라 부르기도 한다.
빅 엔디안은 최상위 바이트(MSB - Most Signficant Byte)부터 차례로 저장하는 방식이며, 리틀 엔디안은 최 하위 바이트(LSB - Least Significant Byte) 부터 차례로 저장하는 방식이다.
그렇다면 최 상위와 최 하위라는 것은?
뭔가 공감이 되지 않는 설명인데, 이런 설명이 조금 더 씌여있다.
빅 엔디언은 사람이 숫자를 쓰는 방법과 같이 큰 단위의 바이트가 앞에 오는 방법이고
리틀 엔디언은 반대로 작은 단위의 바이트가 앞에 오는 방법이다.
빅 엔디언 <- 높은 주소 - - - - 낮은 주소 - >
리틀 엔디언 <- 낮은 주소 - - - - 높은 주소 - >
즉 단순히 12345678이 87654321과 같이 거꾸로 저장된다기 보다는..
해당 수치를 데이터의 단위 단위로 나누었을 때 그 단위가 거꾸로 배열되는 형태인듯 하다.
메모리의 0에서부터 끝으로 쓰는 방식이 빅 엔디안.
메모리의 끝에서부터 0으로 쓰는 방식이 리틀 엔디안이라 할 수 있다.
오늘날 x86 아키텍처를 사용하는 대부분의 데스크톱 컴퓨터는 리틀 엔디언을 쓰며 이를 ‘인텔 포맷’이라 한다. 거꾸로 네트워크에서는 주소를 빅 엔디언으로 쓰는데, 역사적으로 라우팅이 전화를 거는 식으로 접두 부호로 이루어졌기 때문이다.
장단점
빅 엔디언은 소프트웨어의 디버그 를 편하게 해 주는 경향이 있다. 사람이 숫자를 읽고 쓰는 방법과 같기 때문에 디버깅 과정에서 메모리의 값을 보기 편한데, 예를 들어 0x59654148은 빅 엔디언으로 59 65 41 48로 표현된다.
반대로 리틀 엔디언은 메모리에 저장된 값의 하위 바이트들만 사용할 때 별도의 계산이 필요 없다는 장점이 있다. 예를 들어, 32비트 숫자인 0x2A는 리틀 엔디언으로 표현하면 2A 00 00 00 이 되는데, 이 표현에서 앞의 두 바이트 또는 한 바이트만 떼어 내면 하위 16비트 또는 8비트를 바로 얻을 수 있다. 반면 32비트 빅 엔디언 환경에서는 하위 16비트나 8비트 값을 얻기 위해서는 변수 주소에 2바이트 또는 3바이트를 더해야 한다 . 보통 변수의 첫 바이트를 그 변수의 주소로 삼기 때문에 이런 성질은 종종 프로그래밍을 편하게 하는 반면, 리틀 엔디언 환경의 프로그래머가 빅 엔디언 환경에서 종종 실수를 일으키는 한 이유이기도 하다.
또한 가산기가 덧셈을 하는 과정은 LSB로부터 시작하여 자리 올림을 계산해야 하므로, 첫 번째 바이트가 LSB인 리틀 엔디언에서는 가산기 설계가 조금 더 단순해진다. 빅 엔디언에서는 가산기가 덧셈을 할때 마지막 바이트로부터 시작하여 첫 번째 바이트까지 역방향으로 진행해야 한다. 그러나 오늘날의 프로세서는 여러개의 바이트를 동시에 읽어들여 동시에 덧셈을 수행하는 구조를 갖고 있어 두 엔디언 사이에 사실상 차이가 없다.
엔디안 방식이 중요해지는 것은 네트워크인데.데이터 전송을 할 때 엔디안 방식의 차이에 주의해야 한다. 서로 다른 데이터 저장 방식의 시스템끼리 통신하게 되면 전혀 엉뚱한 값을
주고받기 때문이다.
네트웍 데이터 통신에서는 네트워크 바이트 순서(network byte order, 빅 엔디안)를
따르도록 데이터의 바이트 순서를 변경해야 한다.
(TCP/IP, XNS, SNA 규약은 16비트와 32비트 정수에서 빅 엔디안 방식을 사용함)
이럴 때에 htonl 같은 함수(host to network)를 이용해서 바이트 순서를 정렬시켜주면 된다.
몇몇 아키텍처는 빅 엔디언과 리틀 엔디언 중 하나를 선택할 수 있도록 설계되어 있고, 이를 바이 엔디언(Bi-endian)이라 부른다.
종종 한 방향으로 순서가 정해져 있는 게 아니라, 이를테면 32비트 정수가 2바이트 단위로는 빅 엔디언이고 그 안에서 1바이트 단위로는 리틀 엔디언인 경우가 종종 있는데 이를 미들 엔디언(Middle-endian)이라 한다.
둘이 차이점은 계산할때와 비교할 때 눈에 띈다.
빅 엔디언을 통한 숫자 비교시, 숫자의 비교는 가장 큰 값이 들어가는 왼쪽부터 하게 되는데, 빅 엔디언은 수치를 앞에서부터 차곡차곡 스택에 집어 넣는 반면 리틀 엔디언으로 하게된다면 리틀 엔디언은 숫자 뒤에서부터 스택에 집어 넣기 때문이 빅 엔디언보다 속도가 느리다.
그러나 수치 계산시에는 리틀 엔디안이 빅 엔디안보다 속도가 더 빠른데 두 숫자를 계산을 할 경우 가장 낮은 자리수에 있는 숫자를 계산을 해보고서 자리 올림수가 있는지 없는지 판단을 하고서 자리 올림수와 다음 숫자를 계산을 하기 때문이다.
빅 엔디언은 UNIX 에서 사용하는 RISC 프로세서에서 사용 하는 바이트 오더, 동시에 소켓 프로그래밍에서 중요한 네트워크 바이트 오더, 리틀 엔디언은 Intel 계열의 프로세서에서 사용하는 바이트 오더이다.
빅 엔디안 | 리틀 엔디안 |
Unix 의 RISC계열의 프로세서가 사용하는 바이트 오더링 네트워크에서 사용하는 바이트 오더링 앞에서부터 스택에 PUSH 비교연산에서 리틀 엔디안보다 속도가 빠름 | Intel 계열의 프로세서가 사용하는 바이트 오더링
뒤에서부터 스택에 PUSH 계산연산에서 빅 엔디안보다 속도가 빠름 |
출처 및 참고
: 위키백과
'Reverse Engineering' 카테고리의 다른 글
(Themida) 디버깅 경고 메시지 출력 해결 방법!! (4) | 2017.01.31 |
---|---|
어셈블리어(Assembly) 기초 (5) | 2017.01.29 |
RVA to RAW(PE File Format) (0) | 2017.01.21 |
Hello World 디버깅 실습 (0) | 2017.01.21 |
Crackme 두번째 관문 (0) | 2017.01.19 |
어셈블리어(Assembly) 입문자를 위한 어셈블리어 기초
## 목차 ##
0x01. 어셈블리 언어란? & 배우는 목적
0x02. 어셈블리 언어를 위한 기본 지식
0x03. 어셈블리 명령어의 구성
0x04. 주소지정방식의 이해
0x05. 어셈블리 명령어 정리
0x06. 어셈블리 명령어 상세
0x07. 참조 사이트 및 문서
0x01. 어셈블리 언어란? & 배우는 목적
CPU 에는 해당 프로세서에 명령을 내리기 위해 고유의 명령어 세트가 마련되어 있는데 이 명령어 세트를 기계어라고 한다. 이 기계어는 숫자들의 규칙조합임으로 프로그래밍에 상당히 난해하다. 그래서 이 기계 명령어를 좀더 이해하기 쉬운 기호 코드로 나타낸것(기계어와 1:1로 대응된 명령을 기술하는 언어)이 어셈블리어이다. 어셈블리 언어는 그 코드가 어떤 일을 할지를 추상적이 아닌, 직접적으로 보여준다. 논리상의 오류나, 수행 속도, 수행 과정에 대해 명확히 해준다는 점에서 직관적인 언어이다. 어셈블리 언어를 사용하면 메모리에대한 이해도도 높아진다. 어셈블리를 익히고, 배우는데 있어서는 여러 가지 목적이 있을 수있다. 컴퓨터 시스템&구조를 좀 더 깊게 이해하고, 메모리상의 데이터나 I/O기기를 직접 액세스 하는등의 고급언어에서는 할 수 없는 조작을위해서이다. 프로그램의 최적화 및 리버스 엔지니어링을 위해서도 필요하다.
+ 2줄 요약 +
- 어셈블리 언어는 기계어와 1:1 대응을 하는 언어이다.
- 어셈블리 언어를 배우면 시스템을 이해하는데 도움이 된다.
0x02. 어셈블리를 위한 기본 지식
(1) 기본적인 하드웨어
1) CPU
- 메모리에 있는 내용을 읽고, 쓰고 데이터를 메모리와 각 레지스터로 보낸다.프로그램의 명령을 해석하고 실행한다.하나의 프로세서는 12~14개의 레지스터를 가지고 있으며,CPU의 연산, 논리 장치는 숫자와 기호에 관한 연산자를 인식한다. 보통 이러한 장치들은 기본적인 연산만을 수행할 수 있다(덧셈, 뺄셈, 곱셈, 나눗셈, 숫 자비교). 퍼스널 컴퓨터는 한번에 처리할 수있는 비트수(Word) 따라서 분류된다.
2) RAM
- 반도체로 조립된 셀들의 집합. 프로세스가 프로그램을 실행시키고 작동하기위해서 필요한
정보들을 저장하는데 쓰인다. 각각의 셀들은 숫자값을 포함하고 주소가 정해질 수 있는 형
식이며 프로그램에서 흔히 메모리라고 하는 것들은 메인메모리, 즉, 램이라고 할 수 있다.
(2) 80x86 프로세서
1) CPU 레지스터 종류 : 범용 레지스터, 상태 레지스터, 플래그 레지스터
- 레지스터 : CPU내부의 기억장소로 PC가 정보를 처리하기 위해서는 정보가 특정한 셀에 저장되어 있어야 한다. 이러한 셀을 레지스터라고 불린다. 레지스터들은 8또는 16비트 플립-플롭 회로들의 집합이다. 플립-플롭 회로란 두 단계의 전압으로 정보를 저장할 수 있는 장치이다. 낮은 전압은 0.5 볼트이고 높은 전압은 5볼트이다. 낮은단계의 에너지는 0으로 해석되고 높은 전압은 1이다. 이 상태는 보통 비트로 불리며 컴퓨터의 가장 작은 정보 단위이다.
< 레지스터의 구조 >
① 데이터 레지스터
- 데이터 레지스터는 각종 데이터 처리를 대상으로 하는 하는 32비트 레지스터 및 16비트 레지스터 일부를 프로그래머가 명령 중에서 자유롭게 지정을 할 수 있는 범용 레지스터이다.
: EAX, EBX, ECX ,EDX
② 포인터 레지스터
: ESP, EBP
③ 인덱스 레지스터 (Index register)
: ESI, EDI
④ 세그먼트 레지스터 (segment register)
: CS, DS, SS, ES
+ 범용 레지스터 +
32Bit | 16Bit | 상위8Bit | 하위8Bit | 기능 |
EAX | AX | AH | AL | 누산기(Accumulator,
중간 결과를 저장해 놓음) 레지스터라 불리며, 곱셈이나 나눗셈 연산에 중요하게 사용 |
EBX | BX | BH | BL | 베이스 레지스터라 불리며 메모리 주소 지정시에 사용 |
ECX | CX | CH | CL | 계수기(Counter)레지스터라 불리며 Loop등의 반복 명력에 사용 |
EDX | DX | DH | DL | 데이터(Data)레지스터라
不利며 곱셈, 나눗셈에서EAX함께 쓰이며 부호 확장 명령 등에 사용 |
ESI | SI | 다량의
메모리를 옮기거나 비교할 때 그 소스(Source)의 주소를 가진다 |
||
EDI | DI | 다량의 메모리를 옮기거나 비교할때 그 목적지의 주소를 가리키다. | ||
ESP | SP | 스택
포인터로 스택의 최종점을 저장한다. |
||
EBP | BP | ESP를
대신해 스택에 저장된 함수의 파라미터 지역 변수의 |
+ 세그먼트 레지스터 +
16Bit | 기능 |
ES | 보조
세그먼트 레지스터다. 두 곳 이상의 데이터 저장영역을 가리켜야 할 때 DS와 함께 사용된다. 하지만 32Bit 프로그램에서는 DS와 ES가 같은 영역을 가리키고 있기 때문에 굳이 신경 쓰지 않아도 된다. |
CS | 코드 세그먼트를 가리키는 레지스터. 프로그래머 코드의 시작조소를 가지고 있다. |
SS | 스택
세그먼트를 가리키는 레지스터. 스택의 시작 주소를 담고 있다. 스택 조작에 의해서 데이터를 처리하는 동작이 이루어 진다. |
DS | 데이터
세그먼트를 가리키는 레지스터. 프로그래머가 정해놓은 데이터의 시작주소를 담고 있다. |
FS | 보조 세그먼트 레지스터. FS, GS는 286 이후에 추가된 것으로 운영체제를 작성하는 게 아니라면 없듯이 여겨도 된다. |
GS |
+ 상태 레지스터+
32Bit | 16Bit | 기능 |
EIP | IP | EIP는 현재 실행되고 있는 프로그램으 ㅣ실행코드가 저장된 메모리의 주소를 가리키는 레지스터로 프로그램의 실행이 진행됨에 따라 자동으로 증가하고 프로그램의 실행 순서가 변경되는 제어문이 실행될때 자동으로 변경괸다. 그래서 직접 접근해서 값을 저장하거나 읽거나 하는 일이 없기 때문에 응용 프로그램에서는 손 댈 일이 없는 레지스터이다. |
EFLAGS | FLAGS | 비타 단위의 플래그 들을 저장하는 레지스터로 아주 특별한 용도로 사용된다. |
0x03. 어셈블리 명령어의 구성
- 어셈블리는 어셈블리어라고도 부르는데 이 어셈블리어는 명령어들의 조합이다. 인텔 CPU 안에는 이 명령어들이 회로로 구현되어 있어서 어셈블리 코드를 실행할 수 있다. CPU는 2진수로 모든 것을 처리하는데 어셈블리 명령어들도 2진수로 되어 있다. 하지만 2진수로 된 것
알아보기가 힘들어 mov, add와 같은 형태로 변환하여 보여진다. 아래 그림을 보자.
명령어 다음에 오는 레지스터 이름이나 값들은 operand라고 한다. mov %eax, %ebx에서 %eax 를 제1오퍼랜드, %ebx를 제2오퍼랜드라고 한다. mov %eax, %ebx는 C언어로 보면 ebx = eax의 경우와 같다. eax에 저장된 값을 ebx에 할당(assignment)한다.(특정 장소(주로 메모리상에서)에서 특정 장소(주로 레지스터)로 데이터를 읽어 와서 적재(load)).
‘L1:‘과 같은 명령은 직접적으로 기계어 코드로 번역되지 않고 분기명령(jmp)등에서 참조될 때에, 번지의 계산에 사용된다.
0x04. 주소 지정 방식의 이해
- 어셈블리는 메모리를 직접 다룰 수 있다는 점에서 우리가 어셈블리를 배우는 큰 이유가 될 수 있다. 이 메모리를 다루기 위해서 다양한 주소 지정방식이 있는데 어떤식으로 주소를 사용하고, 참조하는지 확인할 필요가 있다. 참고로 '0x04'에서 예를 들었던 'mov %eax,%ebx'의 경우는 레지스터 어드레싱(register addressing)이다.
1. 즉시 지정방식(immediate addressing)
- mov $0x1, %eax : eax에 (16진수)1을 값을 넣는(할당) 방식이다.
- 이렇게 메모리(기억장치)의 주소의 내용을 꺼내지 않고 직접 값을 대응시키는 방식을 즉 시지정방식이라고 한다.
2. 레지스터 지정방식(register addressing)
- mov %esp, %ebp : 레지스터 ebp에 레지스터 esp의 값을 넣는다.(할당 개념)
나중에 알 수 있겠지만, 위의 명령은 스택포인터를 베이스 포인터에 넣는 명령으로 함수가 시작될때 ebp의 값(일종의 시작기준점)을 정하는 명령이다.
- 레지스터에서 직접 레지스터로 값을 대응시키는 방식을 레지스터 지정방식이라고 한다.
- 속도는 빠르지만 레지스터의 크기(32비트)로 인해 크기가 제한된다.
3. 직접 주소 지정방식(directly addressing)
- mov %eax, $0x80482f2 : 주소 0x80482f2에 있는 값을 eax에 할당한다.
- 가장 일반적인 주소지정방식이며, 메모리의 주소를 직접 지정해서 바로 찾아오는 방식이 다. 즉 eax레지스터에 0x80482f2주소의 내용을 로드(load)한다는 의미이다.
4. 레지스터 간접 주소 지정 방식
- mov (%ebx), %eax
: ebx의 값을 주소로 하여(간접적으로) eax레지스터에 할당
- ‘( )’가 들어간다면 간접 지정이라고 볼 수 있다. ‘( )’의 의미는 괄호 안에 들어간 값의 주소이다.
5. 베이스 상대 주소 지정 방식
- mov 0x4(%esi), %eax
: esi레지스터에서 4(byte)를 더한 주소의 값을 eax레지스터에 할당한다.
- 보통 레지스터의 크기가 4byte이기 때문에 레지스터 다음 주소를 의미한다. 문자열 열산이나 메모리 블록 전송등에 나오는 방식이다.
0x05. 어셈블리어 명령어 정리
0x06. 어셈블리 명령어 상세
- 명령어의 분류
1) 데이터 이동 : mov, lea
2) 논리, 연산 : add, sub, inc, dec
3) 흐름제어 : cmp,jmp
4) 프로시져 : call, ret
5) 스택조작 : push, pop
6) 인터럽트 : int
1) 데이터 전송
1. mov (move data)
- 형식 : mov SOURCE, DESTINATION
- 기능 : SOURCE위치에 들어있는 데이터를 복사하여 DESTINATION위치에 저장.
- 원칙 : 메모리와 레지스터(모든 연산은 레지스터에 저장된뒤 이루어진다.) 사이의 데이터 이동, 레지스터와 레지스터 사이의 데이터 이동이나 값을 메모리나 레지스터에 대 입할 때 사용한다. (SOURCE와 DESTINATION의 크기가 동일해야 한다.)
! DESTINATION 레지스터가 CS가 될수 없다.(프로그램실행위치가 변경되기때문)
(CS의 변경은 int, jmp, call, ret등의 명령으로 가능)
! SOURCE와 DESTINATION이 전부 메모리를 가르칠수 없다. (설계상 불가능)
! SOURCE가 직접지정방식일경우에는 DESTINATION은 CS일 수 없다.
2. lea
- 형식 : lea SOURCE, DESTINATION
- 기능 : SOURCE OPERAND에서 지정된 주소를 DESTINATION으로 로드한다.
LEA의 주된 용도는 매개변수나 지역변수의 주소를 얻어오는 것이다.
예를 들어 C언어에서 지역변수나 매개변수에 &연산자를 사용한다면 컴파일러는
lea명령어를 생성한다.
- 원칙 : SOURCE OPERAND는 메모리에 위치해야하며, 변경될 주소는 index register나 DESTINATION에 정의된 주소여야 한다.
2) 논리, 연산 : add, sub, inc, dec
1. add
- 형식 : add opr1, opr2
- 기능 : opr2의 내용에 op1의 내용이 더해져서 그 결과를 opr2에 저장.
- 원칙 : ! 두 개의 오퍼랜드 모두에 메모리로 조합되는 것은 불가능.
2. sub (subtract)
- 형식 : sub opr1, opr2
- 기능 : 첫번째 오퍼랜드로 부터 2번째 오퍼랜드 의 내용을 뺀 다음 결과를 첫 번째 오퍼
- 원칙 : ! 메모리끼리는 뺄셈을 할수 없다.
3. inc (Increment)
- 형식 : inc DESTINATION
- 기능 : DESTINATION을 1 증가시키고 결과값을 다시 저장
4. dec (decrement)
- 형식 : dec DESTINATION
- 기능 : DESTINATION을 1 감소시키고 결과값을 다시 저장
3) 흐름 제어 : jmp, cmp
- 형식 : jmp proc
- 기능 : 프로그램의 흐름을 바꿀 때 사용. proc의 주소로 가서 그곳의 명령어를 실행.
if/else문, loop문(루프가 아직 끝나지 않았을때, 처음위치로 돌아가기 위해)
등에서 나타난다.
2. cmp
- 형식 : cmp value, value
ex) cmp %eax, 0 (eax레지스터의 값을 0과 비교한다.)
je start (비교 결과가 같다면 start로 분기한다.)
(같지 않다면 je 다음에 오는 명령어를 실행한다.)
- 기능 : 두값을 비교하고 비교결과에 따라 분기한다. 보통 레지스터나 메모리 및 숫자의 크기를 비교한다. cmp 명령어는 Zero, Sign, Overflow 등의 플래그를 set or clear 한다. 이 플래그의 결과에 의해서 Jcc 명령어들은 분기할 것인지를 결정한다. 보통 CMP 명령어 다음에 JE, JNE 등의 jmp관련 명령어가 위치한다.
- 원칙 : cmp 명령은 혼자 사용되지 않고 언제나 조건 점프 명령어나 조건 이동(mov) 명령어와 함께 사용된다.
- 조건 점프 명령어 : cmp 명령어의 결과에 따라 점프하는 명령어.
* 참고 *
Unsigned 계열 (부호가 없는 값)
je : jump equal - 비교 결과가 같을 때 점프
jne : jump not equal - 비교 결과가 다를 때 점프
jz : jump zero - 결과가 0일 때 점프, je와 같음. (cmp 명령에서 결과가 같으면 0을 출력)
jnz : jump not zero - 결과가 0이 아닐 때 점프
ja : jump above - cmp a, b에서 a가 클 때 점프
jae : jump above or equal - 크거나 같을 때 점프
jna : jump not above - 크지 않을 때 점프
jnae : jump not above or equal - 크지 않거나 같지 않을 때 점프
jb : jump below - cmp a, b에서 a가 작을 때 점프
jbe : jump below or equal - 작거나 같을 때 점프
jnb : jump not below - 작지 않을 때 점프
jnbe : jump not below or equal - 작지 않거나 같지 않을 때 점프
jc : jump carry - 캐리 플래그가 1일 때 점프
jnc : jump not carry - 캐리 플래그가 0일 때 점프
jnp/jpo : jump not parity / parity odd - 패리티 플래그가 0일 때 / 홀수일 때 점프
jp/jpe : jump parity / parity even - 패리티 플래그가 1일 때 / 짝수일 때 점프
jecxz : jump ecx zero - ecx 레지스터가 0일때 점프
Signed 계열 (부호가 있는 값)
jg : jump greater - cmp a, b에서 a가 클 때 점프
jge : jump greater or equal - 크거나 같을 때 점프
jng : jump not greater - 크지 않을 때 점프
jnge : jump not greater or equal - 크지 않거나 같지 않을 때 점프
jl : jump less - cmp a, b에서 a가 작을 때 점프
jle : jump less or equal - 작거나 같을 때 점프
jnl : jump not less - 작지 않을 때 점프
jnle : jump not less or equal - 작지 않거나 같지 않을 때 점프
jo/jno : jump overflow / not overflow - 오버플로 플래그가 1일 때 / 0일 때 점프
js/jns : jump sign / not sign - 사인(부호) 플래그가 1일 때(음수) / 0일 때(양수) 점프
조건 점프 명령을 조합하여 if ( a > b ), for, while등의 조건문 구현
4) 프로시져 : call, ret
1. call
- 형식 : call Target
- 기능 : 스택 상에서 CS를 다음에 오는 명령의 오프셋 어드레스를 PUSH하고 target으로 이동한다. 즉, 다른 함수로 제어를 옮긴다는 뜻이다. CALL 명령어 다음에 오는 명령어의 주소를 스택에 PUSH하고 주어진 주소로 제어를 옮긴다는 뜻(EIP를 변경시킴)
# CALL명령은 CALL명령 다음위치에 있는 명령의 주소를 스택에 push한다.
2. ret (return)
- 형식 : ret
- 기능 : 호출된 함수에서 호출한 함수로 복귀. esp에 있는 값을 꺼내서(pop) EIP레지스터에 할당한다. 즉, call명령 당시 push되었던 주소를 pop하여 eip에 넣는 것이다.
5) 스택조작 : push, pop
1. pop
- 형식 : pop DESTINATION
- 기능 : 스택 맨 윗부분(top)에서 하나의 워드를 DESTINATION에 로드(load)그리고 스택포인터는 그 바로 전의 데이터를 가리킨다(point).
2. push
- 형식 : push DESTINATION
- 기능 : 메모리상에 설정된 스택이라는 공간에 데이터를 저장한다. 스택의 가장 윗부분에
데이터를 저장. 스택 포인터(esp)도 워드크기만큼 증가한다.
6) 인터럽트 : int
- 형식 : int (interrupt-type)
- 기능 : 운영체제에 할당된 인터럽트 영역을 system call.
0x07.참조 사이트 및 문서
1. “김병희”님이 쓰신 문서. (제목이 나와있지 않네요)
2. Lecture Note in Assembly Language Written by Han, Kwang-Rok
3. 블루님의 매크로 어셈 이야기
4. Just Enough Assembly Language to Get By, Part 1,2 by Matt Pietrek
5. 김성훈님의 C 프로그래머가 알아야 할 것들 - Chapter 7 어셈블리
6. 유용수님의 어셈블리 강좌
7. 김영빈님의 “헥커가 되자”
8. C를 어셈블리어로
9. Assembly Tutor
'Reverse Engineering' 카테고리의 다른 글
(Themida) 디버깅 경고 메시지 출력 해결 방법!! (4) | 2017.01.31 |
---|---|
리틀엔디언 VS 빅엔디언 (0) | 2017.01.30 |
RVA to RAW(PE File Format) (0) | 2017.01.21 |
Hello World 디버깅 실습 (0) | 2017.01.21 |
Crackme 두번째 관문 (0) | 2017.01.19 |
이번에는 "RVA to RAW"에 대해서 포스팅하도록 하겠습니다. "RVA to RAW"를 간단하게 설명하자면, RVA to RAW 는 PE 파일이 메모리에 로딩되었을 때 각 섹션에서 메모리의 주소(RVA)와 File Offset(RAW)을 매핑하는 것을 말합니다.
이전 PE File Format 포스팅에서 언급했던 VA와 RVA에 대해서 간단하게 다시 얘기하고 시작하도록 하겠습니다.
RVA ↔ RAW(File Offset) 변환 작업은 PE 헤더를 공부할 때 가장 기본이 되는 개념이므로 잘 숙지하도록 합시다.
# RVA to RAW
- RVA는 PE 파일이 메모리에 로딩되었을 때의 메모리 주소를 의미하고, RAW는 PE 파일이 로딩되기 전에 File Offset을 의미합니다.
- RVA to RAW는 PE 파일의 각 섹션이 메모리에 로딩되기 전의 File Offset과 메모리에 로딩된 후에 로딩된 위치의 주소를 매칭하는 것입니다.
# RVA to RAW 방법 (매핑하는 방법)
① RVA가 속해 있는 섹션을 찾는다.
② RAW 구하는 비례식을 이용하여 RAW(File Offset)을 구한다.
# RVA to RAW 매핑하는 방법은 위의 설명 처럼 간단합니다. 익숙해질 수 있도록 연습을 해보도록 하겠습니다.
- 바로 위에 보이시는 그림이 Windows7 운영체제의 Calc,exe 파일이 메모리에 로딩되는 모습을 그려놓은 것입니다. 이그림을 가지고 매핑
하는 연습을 해보도록 하겠습니다.
- 우선 왼쪽편이 File (Offset) 입니다. 오른쪽편이 Memory 구요. 이전 PE File Format 포스팅에서 언급했었는데, PE File 일 때의 섹션 크기와
위치는 Memory에 로딩되면 각 섹션의 크기와 위치가 달라진다고 했었습니다. ( 크게 변하진 않지만, 동일하진 않다고 했었습니다 )
- 위에 그림에서 보이시는 File의 Offset과 Memory에서의 VA(Virtual Address)는 제가 PE View 툴을 이용하여 다 구한 값들입니다. File에서의
섹션 크기와 Memory에서의 섹션 크기가 조금씩 다르신게 보이시죠? 앞에서 말했듯이 크게 변하진 않았습니다. 우선 이런점들을 미리 알고 계
셔야 "RVA to RAW"를 이해하시기 편하실것 같습니다.
- 예제 문제를 풀기전에 VA(Virtual Address)와 RVA(Relative Virtual Address)에 대해서 다시 한번 정리하고 예제 문제를 풀어보도록 하겠습
니다.
- RVA to RAW 비례식을 이용하여 RAW 주소를 구할 수 있는데요. 이 비례식에 존재하는 VirtualAddress는 우리가 지금껏 말하고 있던 VA
(Virtual Address)가 아닙니다. VA는 프로세스의 메모리에서의 절대주소라고 설명했습니다. 위에서 RAW(Offset)를 구하기 위한 식에서의
VA(VirtualAddress)는 Section Header의 멤버인 VirtualAddress를 의미합니다. Section Header 구조체의 멤버인 VirtualAddress 멤버는
메모리에서 섹션의 시작 주소(RVA)를 의미합니다. 결론적으로 RAW 비례식에서의 VirtualAddress는 우리가 앞에서 계속 얘기하던 RVA
(프로세스 메모리에서의 상대주소)를 말하는 것입니다. 이 부분만 주의하신다면 쉽게 매핑할 수 있으리라 생각합니다.
( 저는 RAW를 구하는 비례식의 VirtualAddress가 프로세스 가상 메모리의 절대주소를 의미하는 것인줄 알고 한참 삽질을 했습니다. )
# 1. RVA = 3000일 때 File Offset (RAW) 은 얼마인가 ?
- RVA 값이 3000입니다. RVA는 프로세스 가상 메모리에서의 상대주소입니다. 위에 Memory 쪽의 VA를 보시면 제일 처음 "01000000"으로 시작
하는 것을 볼 수 있는데요. 바로 저 값이 기준 위치가 되는 ImageBase 값입니다. [ ImageBase = 01000000 ]
- 지금부터 RVA to RAW 매핑 방법대로 순서대로 해보도록 하죠. 첫 번째가 주어진 RVA가 속해있는 섹션이 어떤 섹션인지 찾는 것입니다.
위 그림을 보시면 메모리상에서 .text 섹션의 시작 RVA가 1000이고, 크기가 52CA1이니까 53CA1까지 .text 섹션이 되겠네요. RVA 3000은
.text 섹션에 포함되는 군요. [ RVA = 3000 해당 섹션 → .text 섹션 ]
- 이제 두 번째 해야할 것이 RAW 비례식을 이용하여 RAW (Offset)을 구하는 것입니다. 비레식을 이용해서 구해보도록 하죠.
식 : 3000 (RVA) - 1000 (VirtualAddress) + 400 (PointerToRawData) = 2400 (RAW)
* RAW 비례식에서의 VirtualAddress와 PointerToRawData는 Section Header 구조체의 멤버들로, VirtualAddress는 메모리에서 섹션의 시작
주소(RVA)를 의미하고, PointerToRawData는 파일에서 섹션의 시작 위치를 의미합니다.
* RVA to RAW 가 어떤것인지 이제 어느정도 감이 오시죠? 리버싱 관련 작업들을 할 땐 이렇게 RVA에서 RAW로 RAW에서 RVA로 바꾸는 작업이
가장 기본이 된다고 하네요. 꼭 숙지하도록 해야겠습니다. 예제 하나만 더 풀어보고 이번 포스팅을 마치도록 하겠습니다.
# 2. RVA = BC123일 때 File Offset (RAW) 은 얼마인가 ?
- RVA = BC123 입니다. 해당 RVA가 속해 있는 섹션을 찾아보니, .reloc 섹션에 포함되어있네요. [ RVA = BC123 해당 섹션 → .reloc 섹션 ]
- 식 : BC123 (RVA) - BC000 (VirtualAddress) + B9C00 (PointerToRawData) = B9D23 (RAW)
- 위에서 처럼 RAW (Offset)을 구한 후에는 실제로 그 Offset에 해당 섹션이 있는지 확인하셔야합니다. 혹시 메모리상에서 포함되었던
섹션이 아니거나, 벗어난다면 " 해당 RVA에 대한 RAW를 정의할 수 없다" 라고 해야 합니다. 이렇게 딱 떨어지지 않는 경우가 Virtual
Size와 SizeOfRawData 값이 서로 달라서 벌어지는 일들이라고 하는데요. 이러한 부분은 좀 더 공부를 한 후에 알 수 있다고 하네요.
# "RVA to RAW"에 대해서 알아 봤는데요. 생각보다 쉬운 내용이었던 것 같습니다.
# 참고 도서 : 리버싱 핵심원리
출처: http://yokang90.tistory.com/21 [yO Kang]
'Reverse Engineering' 카테고리의 다른 글
리틀엔디언 VS 빅엔디언 (0) | 2017.01.30 |
---|---|
어셈블리어(Assembly) 기초 (5) | 2017.01.29 |
Hello World 디버깅 실습 (0) | 2017.01.21 |
Crackme 두번째 관문 (0) | 2017.01.19 |
Crackme 첫번째 관문 (0) | 2017.01.19 |
# 안녕하세요. 이번 포스팅에서는 디버깅시에 자주 쓰이는 OllyDbg, IDA Pro, GDB를 이용하여 Window 및 Linux 환경에서 간단한 실행 파일 디버깅해보겠습니다. 리버싱 공부를 시작한지 얼마안되서 틀린 내용이나 부족한 부분이 많을 수 있으니, 그러한 점은 양해부탁드립니다. (틀린 내용이 있을 시 지적해주시면 정말 감사하겠습니다 ^^)
우선 Visual Studio를 이용하여 C 언어로 "Hello World!" 라는 문구를 출력하는 프로그램을 작성했습니다.
[ 그림 1 ] "Hello World!" 문구를 출력하는 콘솔 프로그램 작성
1. 첫 번째로 OllyDbg를 이용하여 디버깅해보도록 하겠습니다.
[ 그림 2 ] OllyDbg를 이용하여 "Hello World.exe" 파일 불러오기
- OllyDbg로 앞에서 작성한 "Hello World.exe" 파일을 실행했을 때, 처음 시작하는 부분입니다. (ENTRY POINT)
- 가장 먼저 mainCRTStartup 이라는 부분으로 점프하는 명령어를 볼 수 있는데요. 이 mainCRTstartup 이라는 함수는 저희가 작성한 코드의 main
함수부분일까요? 해당 명령어를 실행시켜 어떤 함수인지 한번 살펴보도록 하겠습니다.
[ 그림 3 ] mainCRTStartup 함수로 이동
- mainCRTStartup 부분으로 점프한 모습입니다. 대충 명령어들을 살펴보면, security_init_cookie 함수와 tmainCRTStartup 이라는 함수를 호출
하고, 리턴하는간단한 함수입니다. 호출하는 security_init_cookie 함수와 tmainCRTStartup 함수가 어떤 작업을 하는지 간단하게 확인해보도
록 합시다.
[ 그림 4 ] security_init_cookie 함수
[ 출처 : http://msdn.microsoft.com/ko-kr/library/ms235362.aspx ]
- 전역 보안 쿠키를 초기화하는 함수라고 합니다. 우선 이러한 함수가 있다는 점으로 보아, 우리가 찾던 C 코드의 main 부분이 아니라는 것을 확실히 알
수 있습니다.
[ 그림 5 ] Entry
[ 출처 : http://msdn.microsoft.com/ko-kr/library/f9t8842e.aspx ]
- 디버깅 툴을 이용하여 어떠한 파일을 열었을 때, 시작하는 첫 부분을 Entry Point 라고 합니다. 위의 그림에서 설명하고 있는 Entry 함수에 내용을
살펴보니, mainCRTStartup 함수에 관해서 나와있네요. 제가 작성한 프로그램은 CONSOLE 프로그램이므로, mainCRTStartup 함수가 해당 파일의
시작점임을 확인할 수 있습니다.
- 참고로 mainCRTStartup 함수는 다음과 같은 일들을 수행합니다.
1. 전체 명령행(commandLine)을 가리키는 포인터를 획득
2. 환경 변수를 가리키는 포인터를 획득
3. C/C++ 런타임 라이브러리의 전역 변수를 초기화
4. C/C++ 런타임 라이브러리의 메모리 할당 함수(malloc, calloc...)와 저수준 입출력 루틴이 사용하는 힙을 초기화
5. 모든 전역 오브젝트와 static c++ 클래스 오브젝트의 생성자를 호출
6. 사용자가 정의한 진입점 함수(WinMain 또는 main)를 호출
- 위의 내용들을 정리해보면, 어떠한 프로그램을 디버깅할 때 시작 Entry는 우리가 만든 프로그램의 main 함수가 아닌, 실행전 필요한 작업들을 위한
함수들이 먼저 호출된다는 것입니다. 그러한 함수들을 호출한 후, 그 함수들로 하여금 우리가 작성한 main 함수를 호출하게 하는 것입니다.
- 사실 저런 함수들은 실제로 디버깅할 시에는 자세하게 볼 필요가 없을 듯 합니다. 저런 함수가 어떤 기능인지 간단하게 알고 있다면, 다음에 디버깅할
땐 저러한 함수들을 그냥 쉽게 쉽게 넘어가면 될 것 같습니다.
- 이제 우리가 작성한 프로그램의 main 함수를 찾아 보겠습니다.
[ 그림 6 ] main 함수
- mainCRTStartup 함수내에서 실행시키다보면, 쉽게 main 함수를 호출하는 부분을 찾을 수 있을 겁니다. 위 화면은 main 함수를 호출한 모습입니다.
main 함수 자료형이 int 형이였고, 인자는 void로 작성했는데 첫 째줄 주석부분을 보면 쉽게 확인할 수 있습니다.
- 명령어들을 살펴보면, "Hello World!" 라는 데이터를 입력하기 위해 0C0만큼 할당하는 부분을 볼 수 있고, "Hello World!" 문자열을 인자로 printf
함수를 호출하는 것을 볼 수 있습니다. 그 이후에 할당했던 스택을 정리하고 리턴, RTC_CheckEsp 함수는 정확하게는 모르겠는데, 대충 함수
호출 전후의 ESP를 체크하는 함수로 예상되네요.
2. 두 번째로 IDA를 이용하여 디버깅해보도록 하겠습니다.
[ 그림 7 ] IDA를 이용한 디버깅
- IDA를 이용하여 "Hello World.exe" 파일을 열었을 때 모습입니다. 보시는것 처럼 제가 작성한 코드의 main 함수를 바로 찾아주었네요.
코드 내용은 차이가 거의 없습니다.
- IDA는 저도 이번에 처음 써보는데요. 정말 좋은 디버깅 툴인것 같습니다. 우선 왼쪽 상단에 보시면 Function name 이라고 해당 프로그램에서
사용되는 함수들의 이름을 나열해주구요. 저기서 함수명을 더블클릭하면 오른쪽 편에 코드를 바로 찾아서 띄워줍니다. 그 아래에 있는 Graph
overview 부분은 프로그램의 흐름도를 그림으로 보여주는 건데, 해당 메인 함수의 코드가 너무 간단해서 아무것도 뜨지 않네요.
[ 참고 ] Graph overview
- 이게 바로, Graph overview 기능입니다. 왼쪽에 check_managed_app 함수 부분을 본거에요. OllyDbg로 디버깅할 땐 디버깅하다보면, 어디
부분을 디버깅하고 있는지, 헷갈릴 때가 있는데, IDA는 이런 좋은 기능들이 많아서 편하게 디버깅할 수 있을 것 같습니다. 이 외에도 엄청
나게 많은 기능들이 있는 걸로 아는데, 사용법좀 익힌후 블로깅하도록 하겠습니다.
3. 세 번째로 GDB를 이용하여 디버깅해보도록 하겠습니다.
- 참고 : GDB는 C, C++, Modula-2 로 구현된 프로그램을 디버그할 수 있는 도구입니다.
[ 그림 8 ] 우분투(리눅스)에서 C 코딩
- 우분투에서도, vim 편집기를 이용하여 "Hello World!"라는 문구를 출력하는 프로그램을 작성합니다.
[ 그림 9 ] 작성한 코드 컴파일 후 실행
- 리눅스 환경에서는 gcc 라는 프로그램을 이용하여 코딩한 파일을 컴파일 합니다.
- 작성한 c 파일을 컴파일하고, 실행한 모습입니다. "Hello World!"라는 문구를 출력하는 것을 볼 수 있습니다.
- 이 프로그램을 이제 GDB를 이용하여 디버깅 해보겠습니다.
- 참고 : 저는 gcc로 컴파일할 때 -g 옵션을 주지 않았는데, -g 옵션 주어 컴파일하면 gdb가 필요로 하는 부가 정보들이 추가되어 디버깅할 때
더 도움이 된다고 합니다.
[ 그림 10 ] GDB를 이용한 디버깅 - 1
- 위 사진을 보시면 우선 첫 째줄에서 'hello' 파일을 gdb로 불러옵니다.
- (gdb) set disassembly-flavor intel : 어셈블리 코드를 intel 기반 어셈블리어로 변경하는 작업입니다.
- (gdb) disassemble main : intel 기반으로 변경한 후, main 함수를 보기위한 명령어입니다.
- 보시는 코드가 앞에서 작성한 C 코드의 Main 함수부분에 해당하는 코드입니다. Visual에서 작업했던것보다 더 짧네요.
- 보시면 <+4> 부분에서 edi 레지스터에 0x4005f4 라는 주소를 복사하고 있는데요. 0x4005f4 부분이 아마도 "Hello World!"
문자열이 들어가있는 주소로 예상되네요. 그런 후 출력하는 함수를 호출하는 것으로 예상되고, pop으로 할당한 공간을 비우고
리턴합니다.
- 그럼 break point를 걸어서 디버깅해보도록 하겠습니다.
[ 그림 11 ] GDB를 이용한 디버깅 - 2
- 우선 break point를 3곳으로 설정하겠습니다.
1. 첫번째는 main 함수의 첫번째 줄입니다.
2. 두번째는 *main + 9 입니다. 이렇게 break point를 걸고, 실행하면 break point가 지정된 코드 직전 코드까지 실행되게 됩니다.
따라서, *main + 4 까지 실행되는거죠. *main + 4 의 코드가 0x4005f4 라는 주소를 edi 레지스터에 복사하는 것인데 저 레지스터에
들어가는 주소에 "Hello World!"라는 문구가 있다고 예상했습니다. 그 주소에 있는 문자열을 확인하기 위해 *main + 9 에 break point를
설정한 것입니다.
3. 마지막으로 *main+14 입니다. 여기까지 실행하면 중간에 함수를 호출하는 부분을 실행하게 되는데, 예상한 것이 맞다면 "Hello World!"를
출력할 것입니다. 출력한다면 호출하는 함수는 printf 함수임을 알 수 있습니다.
- break point를 설정한 후 run 명령어를 이용하여 디버깅을 시작합니다. break point에서 멈추는 것이 보이시죠?
그 다음 break point 직전 코드까지 실행하기 위해서는 continue 명령어를 사용합니다.
자, 우리가 추측했던 코드를 실행한 후까지 왔습니다. $edi 레지스터에 있는 String을 확인했더니, "Hello World!" 가 정확하네요.
그런후 한번더 continue 하니 해당 문자열이 출력됩니다.
# 코드가 간단한 파일이라 정말 쉽게 디버깅할 수 있었는데요. 프로그램이 커질수록 디버깅하기가 정말 힘든것 같습니다. 그리고, 명령어들도
많이 알아야 하구요. 명령어나 디버깅 툴에 대한 사용법은 구글링으로 쉽게 찾으실 수 있을 겁니다. 다음에는 조금 더 복잡한 프로그램을 가지고
디버깅해보도록 하겠습니다. 그럼 이번 포스팅은 여기서 마치겠습니다.
'Reverse Engineering' 카테고리의 다른 글
어셈블리어(Assembly) 기초 (5) | 2017.01.29 |
---|---|
RVA to RAW(PE File Format) (0) | 2017.01.21 |
Crackme 두번째 관문 (0) | 2017.01.19 |
Crackme 첫번째 관문 (0) | 2017.01.19 |
PE File Format에대해 알아보겠습니다. (1) | 2017.01.19 |