호고곡 모야 티스토리 왜이렇게 변했나욤!? 글쓰는 창부터 현대판이 되어버렸눈데욤!?

앗 오랜만에 찾아뵈었으니 인사부터 드려야한다는걸 깜빡하구 변해버린 티스토리에게 이목이 끌려버렸네용 헤헤

대학원 준비한다고 안보이던 야미가 갑자기 돌아왔어여!! 오랜만에 글 쓰는 김에 인싸용어를 주섬주섬,,

 

 

요즘에 유튜브에서 인싸용어 정리해주시는 분들이 계신데, 그걸로 공부하고있서오.. 어렵더라구용 인싸용어란 참 ㅜㅜ

저는 3월부터 대학원 공부를 때려치고! 취직을 하였서오! 토익을 해야하는데 아직 급하지가 않은지 토익공부하기가 넘넘 시르다! 하여 이번에는 본가 근처의(도보 15분가량) 회사로 왔서오 헤헤

이번에도 이전과 같이 보안솔루션 개발이예욥 아 뭔가 인싸용어를 계속 나열하면 파오후 쿰척쿰척 오덕후가 될 것 같아 인싸용어는 자제해야겠어오,,

 

참 그래서 이번에 맡은 솔루션은 WAF !! 아주 흠터레스팅한 솔루션을 맡았는데, 개발자가 저 혼자.. 1인 개발팀에서 하는게 오바쎄바참치넙치네욤 ㅜㅜ 얼른 팀장님이 뽑히기를!!

그간 이런일 저런일이 많았지만... 음 아무래도 크게 요약하자면 웹방화벽 솔루션 개발팀에 책임연구원으로 취직하였고, 아이맥을 샀다는 것!! 27인치인데 베젤까지 합치면 거의 32인치인 것 같아오 넘나리 큰것... 넷플릭스로 영화보기 참 조은 모니터를 산 느낌이랄까욤? 우헤헤뿌헤헤

 

자! 이번에는 챕터 2개를 한 번에 휘리릭 나아가볼까 해욥!! 29장과 30장의 Multicore Processor 와 Local APIC 인데, PIC 는 https://yummyhit.tistory.com/12 에서 다뤘었어요! 인터럽트 처리할 때 IRQ 번호를 통해 어디서 어떤 인터럽트가 들어온 것인지 처리하는 것이었죠!

그리고 멀티코어 프로세서는 이름만 봐도 "아~ 이거슨 여러개의 코어로 처리하기 위한, 요즘 나오는 hexa core hexa thread 같은 그것이로구나!" 라고 생각하셨으리라 믿어 의심치 않숩미다리 헤헤

 

Multi-core processor(멀티코어 프로세서)의 위키적 의미는 단일이 아닌 여러개로 나뉘어진 코어(CPU 집적 회로)를 1개의 칩으로 통합시킨 것을 의미해요. 한 개의 칩 안에 dual-core 라면 2개의 코어가 들어있는 것이고, hexa-core 라면 6개의 코어가 들어있는 그런것이죠!

그림을 보며 이해해봅씨다!

 

 

이정도는 이름만 봐도 아신다구여?! 헤헤 역시 다들 똑똑이이심미다!! 멀티프로세싱이 나오면 빠질 수 없는 하이퍼쓰레딩이죠!

 

Hyper-Threading 은 1개 코어가 2개 코어인 것 처럼 돌아가도록 보여주는 기술인데요, 2개 코어인 것 처럼 돌아가는 것을 SMT(Simultaneous Multi-Threading, 동시 멀티쓰레딩)이라고 한답미다!! SMT 는 superscalar(슈퍼스칼라) CPU 의 하드웨어 멀티쓰레딩을 개선한 기술인데, 꼭 2개 코어인 것 처럼이 아니라 Multi, 말그대로 여러 개처럼 보이도록 해주는 기술이지욤!! superscalar 는 CPU 내에서 여러 개의 pipeline 을 통해 명령어를 동시에 실행시키는 기술이에욥!! 처리속도를 빠르게 하기 위한 기술!!

 

앗 하이퍼쓰레딩 하나에 3개의 기술이 튀어나왔네욤 헤헤 양파같은 녀석... 이 멀티코어 프로세서를 이용한 예제 그림을 보면 "아~ 이렇게 각 코어마다 기능을 달리 할 수 있다는 거시로구나~" 하실 거애오!!

 

 

딱! 보면 아시겠져!?

 

GPU 는 Graphic Processing Unit 으로 그래픽적이 비중을 많이 차지하고 영상 처리를 할 때 화면에 출력되는 것이 비중이 높으므로 메모리 처리를 빠르게 화면으로 출력하기 위한 CPU 라고 생각하시면 되어욤!! 그렇다고 CPU 와는 다른 것이 CPU 는 다이에 붙는데, GPU 는 다이에 포함될 때도, 그래픽 카드에 부착될 때도 있어서 다르지용!!

 

DSP 는 DSP 를 위한 프로세서인데욤!! 호에에 같은 용어!! 헤헤 농담해보고싶었숩미다리 processing 과 processor 에욤!! 실시간 운영체제인 RTOS 를 위해 사용되는 코어가 DSP 와 Fast 코어구용! DSP 칩셋의 경우 리버싱에 아주 유명한 툴인 IDA 의 디컴파일 플러그인으로 쓸 수 있는 instruction 이 들어있다고 해욤!

 

나중에 저도 꼭 한 번 만들어보고싶었는데 헤헤 디컴파일 재밌을것같지 않나욥!!

 

약 20년 전에는 Clock을 높여 수행 속도를 빠르게 하는 방법으로 대체하였던 것이 이제는 코어를 늘리는 방식으로 빠밤! 컴퓨터 사실 때 4.4GHz 같은 것이 클록주파수에욤!! 무조건 클록주파수와 컴퓨터 속도가 비례하는 것은 아니구요!! "클록이 높으면서 + 프론트 사이드 버스 속도도 높고 + RAM Clock + L1~3 Cache 양" 이 모든 것이 컴퓨터 속도에 관여를 하지용!

 

Clock Frequency(클록 주파수)는 대학 논리회로 수업때 배웠던 것이었는데, 0과 1만을 발생시키는 클록이 AND, OR, NAND, NOR, XOR 등의 GATE로 이루어진 플립플롭을 통해 나오는 output 으로 이루어 진것이 반도체 기술이자 현대의 기계들이에욧!! CPU 자체 처리 속도는 클록 주파수와 비례하지만, 이에 따른 주기억장치(RAM)와 보조기억장치(Disk Drive) 등이 클록에 대응해야 하니, 삼위일체가 되기 위해선 시간이 쵸큼 걸리겠죠!? 재미있는 사실은 요즘 컴퓨터 살 때 보면 GHz 를 기본 전제로 하지만, 불과 20년 전에 펜티엄 ll 시절만 해도 300~400MHz 가 짱짱이던 시절이 있었다는 것!!

 

자 그럼 이제 책을 봅씨다!! 챕터 29장에서는 코어를 기준으로 돌아가기 때문에, 하드웨어쪽이 강해서 이론공부는 그렇게 많지 않아욤!! 이라고 말하고 책을 한 장 넘기니 호에에!?

 

BIOS 영역에서 부트로더로 넘어오기 전 POST(Power On Self Test) 과정에서 하드웨어 점검이 이미 이루어져, 부트로더 진입 전에 정보를 가져올 수 있습미다!! 그리고 그 과정을 실행하는 코어의 이름은 바로 BSP(Bootstrap Processor) 라고 합미다!!

 

여러분이라면 Bootstrap 이란 용어를 많이 들어 보시지 않으셨을까 함미다만,, 웹 Front-end 개발의 scss 와는 전혀 다른것이에욥!!

 

그리고 BSP 가 부팅과정을 마치고 부트로더로 진입 할 때 작용하는 코어는 AP(Application Processor) 라고 하구욤!! 이번엔 네트워크에서 사용되는 용어인 AP 가 등장하네욤?! 호호 네트워크의 AP 는 Access Point 로써, 일반적으로 공유기라고 알고있는 것인데, 실질적으로 access point 는 크기가 크고 중앙집중식 원격관리용도의 기기여서 NAT ip 망이 아닌 ISP 자체의 IP 를 분배하는 기능을 가지고 있습미다. 그리고 크기가 큰 만큼 자그마한 공유기와 다르게 부하분산 처리속도 및 안테나 무선 전송속도가 빨랐었었지욤!! 요즘에야 공유기도 아주 자알 나오구 안테나 8개 이상 달린것이 나와 속도도 Ehternet 케이블 만큼 빨라졌으니 요즘의 공유기는 AP 보다 더 뛰어난것 같네용 기능도 여러가지이구,, 헤헤 머지않아 AP 는 공유기의 일부이다- 라고 되어버릴 것도 같지만 이거슨 뇌피셜이니 바이니-☆

앗 이게 아니었네욤 또 삼천포로 빠져버린거시어따- Application Processor 는 BSP 가 깨우면 수행하도록 되어있서욥!!

 

현재 우리의 운영체제는 PIC 로 되어있지만, 이건 싱글코어의 아주 예전.. 음 임베디드쪽은 잘 모루겠내오 이쪽이라면 아직 싱글코어에 PIC 기반인 것이 있을것같기두!? 그래서 우리는 멀티코어로 전환하며 함께 APIC(Advanced Programmable Interrupt Controller)를 구현하려 하는거구욧!!

 

참 여담이지만 야미는 이번회사에 취직하기 전에 책과 함께하는 OS 개발을 시작한지 18개월만에 끝냈답미다!! 흑 회사다니면서, 사람들 만나면서 개발까지 하기란 참 어려웠던 것이었던 거심미다 ㅜㅜ 거의 끝을 앞두고 오랫동안 못한게 참 아쉽내오.. 시간만 있었으면 아마 5~6개월 내로 끝내지 않았을까 싶어오 ㅎㅎㅎ 완성된 소스코드는 https://github.com/yummyhit/yummyHitOS 에 있으니 참고해주시면 될 것 같아오!! 아직 책을 진행 중이신 분들께선 아자아자 빠이팅!!

 

 

짜란~ 이게 완성된 거시에오!! 데스크탑으로 포팅까지는 완료했는데, 흑 PS/2 가 아닌 USB 포트 방식의 마우스라서 그런지 마우스 인식이 되지 않더라구욤 ㅜㅜ 그래서 당연하게도 키보드는 테스트조차 하지 못하였고... 커널 모듈을 이제 올려야하눈데 후어어 할거 넘나리 많은거시외다!!

 

호잇 다시 본론으로 넘어가서 코어와 APIC 의 관계도를 한 번 볼까욤!? 역시 글보다 그림, 그림보다 직접 경험하는게 가장 머리든 가슴이든 와닿는데에 빡!! 와닿으니깐뇨!!

 

 

좌측 상단의 BSP core -- Local APIC 부터 멀티 코어를 의미하는 AP core -- Local APIC 가 보이시나욤!? 인터럽트는 코어와 직접적으로 1:1 수행이기 때문에 코어에 딱 붙어있도록 그림을 나타낸 것 같아욤!!

또한 BSP core 로부터 나온 것은 I/O APIC, Legacy PIC, ACPI 로 이어져 kernel 모드로, AP core 로부터 나온 것은 16bit real mode to protected mode, and jump to 32bit 를 수행하게 되는군뇨!!

 

아 역시 설명은 그림과 함께 하는 것이 가장 편함미다 헤헤 그림이 없다면 그리면서 하는 것이 편하구욥!!

 

그리고 다시 책을 보니 갓승훈선생님께서 너무 설명을 자세히 해주셔가지구 ... 요약해드릴게욤!! 중요한 정보이니 책을 믿고 넘어가기엔 아쉬운 부분이어서욤!!

 

APIC는 팬티엄 lV 프로세서부터 사용되었고, 당시의 APIC 를 프로세서 내부나 코어 내부로 옮긴 것을 Local APIC 라고 합미다. 이 Local APIC 는 LINT0, LINT1(Local Interrupt) 핀과 ICC(Interrupt Controller Communications) Bus 를 통해 PIC 와 I/O APIC 가 주는 인터럽트를 처리합니당!!

 

용어가 쵸큼 어렵지만, 위 그림을 보시면 이해되시지 않나욤!?

 

또한 Local APIC 는 프로세서나 코어 간 인터럽트를 생성-전달하는 IPI(Inter-processor Interrupt) 메시지 처리 기능도 있어욥!

 

챕터 29장에서의 Local APIC 내용은 여기까지이지만, 챕터 30장에서 Local APIC 를 다루니 그것까지 함께 이야기해볼까용!?

 

사실 커널에서는 인터럽트가 아주아주 중요해요. 발생하는 모든 irregular signal 에 대하여 처리해주는 것이 인터럽트이니까요! 키보드 하나하나 입력되는 것부터, 디스크에 r/w 하는 것, 화면 출력에 변화가 생기는 것 등등 모든 것이 인터럽트가 되는 것임미다! 그렇기에 PIC 에서 APIC 로 업그레이드 하는 데에 이렇게 설명이 길지 않을까욤? 헤헤

 

그리고 Local APIC 는 외부 장치 또는 I/O APIC 로부터 받은 인터럽트를 CPU 로 전달해주고, 내부 타이머, 성능 모닝터링 카운터, 온도 센서 등의 프로세서 내부 인터럽트를 생성 또는 전달하는 역할도 해요! 넘나리 다재다능 멀티태스킹쟁이인것~

그럼 한 번 Local APIC 가 어떤 일들을 하는지 로드맵으로 볼까욥!?

 

 

Local APIC 의 기능을 Block 도식화 한 것이애오!! 우효~~ 기능이와 초매니다-!! 정말 멀티태스킹쟁이가 맞군뇨 헤헤

 

이러한 기능을 할 수 있도록 Local APIC 를 활성화시켜야 하는데, 활성화 시키기 위해선 IA32_APIC_BASE MSR 레지스터와 Spurious Interrupt Vector 레지스터에 접근해야 합미당!! IA32_APIC_BASE MSR 레지스터는 APIC 레지스터의 Base Address 와 APIC 활성화 여부, BSP 여부를 담고 있으며 의사 인터럽트 벡터 레지스터는 HW <-> SW 간의 시간 차로 발생하는 인터럽트이며 APIC 소프트웨어 활성화 여부를 담고 있어욤 ㅎㅎㅎ(의사 인터럽트는 실제 인터럽트가 아니니 EOI(End Of Interrupt) 처리를 해주면 안되어욤!!)

 

챕터 30장을 보시면 정말정말 자세하게 설명을 잘해주셔서.. (당연히 갓-승훈 저자님께서!!) 더 이상 포스팅을 하는 것은 책을 그대로 베껴오는 것만 같아오 ㅎㅎ 딱히 넘겨짚고 간 부분도 없이 정말 상세하게 써주셨더라구용!! 흐 이 책은 완독 10회는 해야 그 본질을 이해할 수 있을 것만 같숩미다 헤헤

 

다시 챕터 29장으로 돌아가볼까욧!! 끼요오옷!!! I/O APIC 는 PIC 를 대체하며 멀티프로세서 지원도 가능한 인터럽트 컨트롤러인데, ICC Bus 를 통해 원하는 Local APIC 로 전달할 수 있어요. 24개 인터럽트 라인을 동시에 처리할 수 있고 외부 장치 인터럽트 라인을 연결시키기도 하지욤!

 

그리고 PIC 모드, 가상 연결(Virtual Wire) 모드가 등장하며 그림과 함께 자세한 설명이 나와있네욤!! Multiprocessor 에 대해 자세히 정의한 Multiprocessor Specification 문서를 참조하면 BIOS 데이터 영역에 대해서 알 수 있다고 해욥!!

 

MPspec.pdf

 

짜잔~!! 이 문서가 '97년도에 작성되었는데 그 이후로 나온게 아주 짧은 구글링으로는 보이지 않는군뇹,, 나중에 더 찾아봐야겠수비다 희희,,

 

오랜만에 찾아온 야미는 여담을 아주 최소화 하고 내용전달을 아주 극대화해서 이야기해보았어요!! 사실 그 동안 또 모아둔 짤이 많이 있눈댐,,, 헤헤 요즘 회사일을 혼자하려니 고민도 많고 머리도 복잡하구.. 글을 써야지 써야지 해놓고선 두달이 후다닥 지나버렸내오...

앞으로 최대한 자주 글을 싸지르도록 해보겠숩미다 헤헤 그럼 다들 인싸용어로 마무으리 해보아욧 !!

 

※주의사항※
연구 목적으로 작성된 것이며, 허가 받지 않은 공간에서는 테스트를 절대 금지합니다. 악의적인 목적으로 이용할 시 발생할 수 있는 법적 책임은 자신한테 있습니다. 이는 해당 글을 열람할 때 동의하였다는 것을 의미합니다.

 

흐어 ㅜㅜ 이 글은 분명 3일 전에 쓰고있던건뎀 갑자기 IE 브라우저가 다운되면서 저장도 안된 상태로 날아가부렀서욤 ㅜㅜㅜ 그래서 다시씀니다!! 후욱,, 후욱,,

요즘 너무 나태해지다 보니 정신이 몽롱해지면서 머리가 몽총해진다는 것을 깨달았어욧!! 세상에나 마상에나 코딩이 안되는거 있죵 ㅜㅜ 그래서! 신년 목표 및 계획을 핑계삼아 오늘부터 열씸히 하려함니다!! 석사 가즈아~

 

 

냠냠!! 역시 *nix 짱짱맨이져!! 꺄륵~ (모든 윈도우 유저에게 죄송함니다.. 흑 제가 윈도우를 좋아하진 않아서욥.. 호고곡!)

참 요즘 깃헙에 재밌는거 올리고있어욤!! 씨언어로 만드는 객체지향 클래스!! 물론 객체지향이라함은 꽃과 같은 기능이 6개나 존재해서(encapsulation, inheritance, overloading, overriding, virtual/interface/abstract, access modifier) 전부 구현은 어렵지만욤!! 클래스 기능을 최대한 구현해보고, C1X(C11 이라고도 함미당)부터 생긴 _Generic 키워드를 통해 오버로딩도 구현할 슈 있어욤!! 이렇게 언어 만들어 가즈아~!

 

자! 오늘 하려고 했던 거슨 바로바로 live packet capture 예욤!! 지난 포스팅에서는 pcap_open_offline() 함수를 통해서 패킷이 캡쳐된 파일을 분석하는 것이었다면, 이번엔 실제로 흘러가는 패킷을 분석하는 것이죵!!

호에에 이것을 구현하믄 이제 sniffer 는 금방 구현하지 않을까욥!? 네 않을 수도 있숨미다.. 왜냐하믄 arp 의 개념을 딱! 머릿속에 박은 채로 victim 과 router 사이에 잘 위치해야하거든욤!! 우선 소스코드를 보여드리기 전에, 수행할 결과화면을 보여드릴게욤!!

 

 

먼저 제 NIC 는 저기 보이는 NPF_{F044528C_..._558A} 하나만 있다고 해욤! 히히 가상머신이라 딱히 vmnet 이 없어서 1개밖에 안잡혀욧!

그리고 이 윈도우의 IP는 172.20.10.5 번이었구욤, 라우터의 IP는 172.20.10.1 이에욤! 172.20.10.3 번이 간혹 보이는뎅, 얘는 제 가상머신 중 하나인 우분투 리눅스의 IP구욤!

Source/Destination MAC Address를 보시면 딱 2가지만 번갈아가면서 나와욤! 하나는 윈도우의 MAC, 다른 하나는 라우터의 MAC 주소람니다!! 호엥 왜 외부 패킷으로 나가는데 라우터까지만 MAC 주소가 나오냐구욤!?

 

인터넷 통신을 보았을 때, Host PC --> Router --> Router --> ... --> Data Center --> ... --> DNS Server --> .. --> Router --> Web Server 와 같은 순서로 패킷이 흐르는데, Host PC 는 7계층에서 시작하여서 Router 가 존재하는 3계층(뭐 Switch 의 경우 MultiLayer 까지 존재해서 Layer 2 ~ 7 까지 다양하지만, 라우터의 경우 L4 까지 존재하는 것으로 알고있어용!!)을 통해 물리계층을 지나 다시 Web Server 인 7계층까지 도달할것이에욤!!

그럼 우리의 Host PC 는 MAC Address 를 담아서 맞물려있는 라우터 즉, 현재 연결되어 있는 네트워크의 라우터에게 패킷을 전송, 이 라우터는 라우팅 테이블을 통해 다음 라우터로 지나가므로 MAC Address 가 필요하지 않아서 헤더를 떼어내 버려요!! 그렇기 때문에 Host PC 의 MAC Address 와 라우터의 MAC Address 만 나오게 되는 것이죵!!

 

※ 참고로 위 작업은 개인 휴대폰의 핫스팟을 이용하였으며, 타인에게 피해가 가지 않도록 실습하였음을 말씀드립니다. 다시 한 번 말씀드리지만 모의실습을 진행할 시 자신만의 실습 환경에서만 진행하시길 부탁드리며, 그렇지 않을 시 모든 법적 책임은 자신에게 있다는 것을 명심하길 바랍니다.

 

해당 패킷 흐름은 Host 인 윈도우 10에서 N사(뇌이뻐!)의 포털사이트에 접속했을 때 잡힌 패킷이에욤! 나중에 패킷들 분석해보시면 중간중간 SSL 적용 안되어있던것도..읍읍

위 네이버로 통하는 IP는 cmd 창이나 terminal 에서 "nslookup www.naver.com" 에서도 볼 수 있는 IP + "traceroute(윈도우의 경우 tracert) www.naver.com" 으로 확인할 수 있으니 "엇!! 이거 해킹아냡!! 막 네이버 아이피 알고 그러면 잡혀가는거 아니얍!!" 하실 필요는 없어용!! 각 포털 사이트 및 중견급 이상 기업의 사이트들은 웹서버에 접근하지 못하도록 중간에 패킷에 정보를 주지 않고 흘리거나, access denied 시켜버려욤!

 

아닛 어떻게 access denied 를 시킬 수 있는거짓!? 리눅스에서의 traceroute 명령은 초기에 UDP 프로토콜을 통해 next hop 으로 넘어가도록 되어있어욤. 그러다가 ICMP 프로토콜의 TTL 값이 끝(총 라우터 64번 거친 경우; 리눅스는 default TTL maximum 64, 윈도우는 default TTL maximum 128)나거나, time to live exceeded 되거나 등등의 오류/성공 코드를 통해 결과를 받아욤!

윈도우에서의 tracert 명령은 처음부터 ICMP 프로토콜을 이용해서 결과를 받구욤! 둘이 약간 다르죵!? ㅎㅎ

 

위 ICMP 프로토콜은 패킷 전송이 원활히 흘러가는가 알아보기 위한 ping 명령을 위할 때가 아니면 사용할 일이 적기에, 보통 막아버려욤! 특히 윈도우는 처음부터 막혀있어서 필요시 wf.msc 와 같은 방화벽 정책에서 열어주어야 함니다!

 

오잉 위 패킷캡쳐 구현을 말씀드리다가 막 네트워크까지 주저리주저리했네욤 :) 히히

이제 소스코드를 보여드릴 때가 된 것 같군뇸!! 아마 이번 포스팅에서는 main 함수까진 못하구 사용되는 라이브러리 및 타 함수만 분석해드리고 빠잇! 할 것 같아욤!! 오늘도 아리따운 칼라스크립터 사이트를 이용해서 가져와보기 전에! 다 가져가야만 속이 후련한 해바라기 식당의 아들을 만나보고 갈까욥!?

 

 

속이 후련했... 냐!!!! 내가 더 슬프게 해주꿰 ㅜㅜ 병진이형! 형은 나가이써 돼지고기 싫으면!!

정말정말 명작인 영화이자 연기 짱짱의 김래원쨩..

그럼 이제 소스코드를 보러 갑씨다! 뾰로롱

 

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
32
33
34
35
36
37
38
39
#pragma comment(lib, "ws2_32.lib")
/*
This code is made by yummyHit using Microsoft Visual C++ 2010 Express.
You must have winpcap and add to library, include directory at your VC/bin directory.
+ Additional, install libnet and include it.
+ Additional, include <libnet-macros.h> in libnet-headers.h file.
Must be add linker: ws2_32.lib; wpcap.lib; Packet.lib
*/
#define HAVE_REMOTE
#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
#include <pcap.h>
#include <libnet.h>
#define PROMISCUOUS 1
#define NONPROMISCUOUS 0
 
void mac_print(int init, struct libnet_ethernet_hdr *eth) {
    int i = 0;
    if(init == 0) {
        while(i < ETHER_ADDR_LEN) {
            printf("%02x:", eth->ether_shost[i]);    // print Source Mac Address
            if((i+1== (ETHER_ADDR_LEN-1))        // If next i value is last index, print last address value and quit loop.
                printf("%02x", eth->ether_shost[++i]);
            i++;
        }
        printf("\n");
    }
    else {
        i = 0;
        while(i < ETHER_ADDR_LEN) {
            printf("%02x:", eth->ether_dhost[i]);    // print Destination Mac Address
            if((i+1== (ETHER_ADDR_LEN-1))        // If next i value is last index, print last address value and quit loop.
                printf("%02x", eth->ether_dhost[++i]);
            i++;
        }
        printf("\n");
    }
}
cs

 

지난 포스팅과 include 하는 것은 거의 똑같져!? 다른거라면 libnet 라이브러리!

지난 코드에선 ethernet frame, arp/ip packet, tcp/udp segment 구조체를 직접 만들어서 패킷 데이터를 할당시켰잖아욤!? 이젠 그럴필요 없슴니다! 묻지도 따지지도 말고 libnet 라이브러리만 추가하시면 되어욤!! 오픈소스로 있으니 직접 사이트에서 다운로드 받으셔두 되구욤!!

(libnet web site: http://packetfactory.openwall.net/projects/libnet)

혹은 리눅스라면 역시 패키지 다운로드를 통하면 됨니다!!

데비안의 경우 libnet1-* / 레드햇의 경우 libnet* 을 통해서 설치하시면 되어욤!

 

#include <libnet.h>

여기서 libnet-headers.h 가 필요한 것인데, 말 그대로 패킷 전송에 필요한 헤더를 모아둔 곳이에욤! 해당 파일에서 필요한 구조체는

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
/*
 *  Ethernet II header
 *  Static header size: 14 bytes
 */
struct libnet_ethernet_hdr
{
    uint8_t  ether_dhost[ETHER_ADDR_LEN];/* destination ethernet address */
    uint8_t  ether_shost[ETHER_ADDR_LEN];/* source ethernet address */
    uint16_t ether_type;                 /* protocol */
};
 
/* 
 *  ARP header
 *  Address Resolution Protocol
 *  Base header size: 8 bytes
 */
struct libnet_arp_hdr
{
    uint16_t ar_hrd;         /* format of hardware address */
#define ARPHRD_NETROM   0   /* from KA9Q: NET/ROM pseudo */
#define ARPHRD_ETHER    1   /* Ethernet 10Mbps */
#define ARPHRD_EETHER   2   /* Experimental Ethernet */
#define ARPHRD_AX25     3   /* AX.25 Level 2 */
#define ARPHRD_PRONET   4   /* PROnet token ring */
#define ARPHRD_CHAOS    5   /* Chaosnet */
#define ARPHRD_IEEE802  6   /* IEEE 802.2 Ethernet/TR/TB */
#define ARPHRD_ARCNET   7   /* ARCnet */
#define ARPHRD_APPLETLK 8   /* APPLEtalk */
#define ARPHRD_LANSTAR  9   /* Lanstar */
#define ARPHRD_DLCI     15  /* Frame Relay DLCI */
#define ARPHRD_ATM      19  /* ATM */
#define ARPHRD_METRICOM 23  /* Metricom STRIP (new IANA id) */
#define ARPHRD_IPSEC    31  /* IPsec tunnel */
    uint16_t ar_pro;         /* format of protocol address */
    uint8_t  ar_hln;         /* length of hardware address */
    uint8_t  ar_pln;         /* length of protocol addres */
    uint16_t ar_op;          /* operation type */
#define ARPOP_REQUEST    1  /* req to resolve address */
#define ARPOP_REPLY      2  /* resp to previous request */
#define ARPOP_REVREQUEST 3  /* req protocol address given hardware */
#define ARPOP_REVREPLY   4  /* resp giving protocol address */
#define ARPOP_INVREQUEST 8  /* req to identify peer */
#define ARPOP_INVREPLY   9  /* resp identifying peer */
    u_char ar_sha[6];       // Sender hardware address
    u_char ar_spa[4];       // Sender IP address
    u_char ar_dha[6];       // Target hardware address
    u_char ar_dpa[4];       // Target IP address
};
 
/*
 *  IPv4 header
 *  Internet Protocol, version 4
 *  Static header size: 20 bytes
 */
struct libnet_ipv4_hdr
{
#if (LIBNET_LIL_ENDIAN)
    uint8_t ip_hl:4,      /* header length */
           ip_v:4;         /* version */
#endif
#if (LIBNET_BIG_ENDIAN)
    uint8_t ip_v:4,       /* version */
           ip_hl:4;        /* header length */
#endif
    uint8_t ip_tos;       /* type of service */
#ifndef IPTOS_LOWDELAY
#define IPTOS_LOWDELAY      0x10
#endif
#ifndef IPTOS_THROUGHPUT
#define IPTOS_THROUGHPUT    0x08
#endif
#ifndef IPTOS_RELIABILITY
#define IPTOS_RELIABILITY   0x04
#endif
#ifndef IPTOS_LOWCOST
#define IPTOS_LOWCOST       0x02
#endif
    uint16_t ip_len;         /* total length */
    uint16_t ip_id;          /* identification */
    uint16_t ip_off;
#ifndef IP_RF
#define IP_RF 0x8000        /* reserved fragment flag */
#endif
#ifndef IP_DF
#define IP_DF 0x4000        /* dont fragment flag */
#endif
#ifndef IP_MF
#define IP_MF 0x2000        /* more fragments flag */
#endif
#ifndef IP_OFFMASK
#define IP_OFFMASK 0x1fff   /* mask for fragmenting bits */
#endif
    uint8_t ip_ttl;          /* time to live */
    uint8_t ip_p;            /* protocol */
    uint16_t ip_sum;         /* checksum */
    struct in_addr ip_src, ip_dst; /* source and dest address */
};
 
/*
 *  TCP header
 *  Transmission Control Protocol
 *  Static header size: 20 bytes
 */
struct libnet_tcp_hdr
{
    uint16_t th_sport;       /* source port */
    uint16_t th_dport;       /* destination port */
    uint32_t th_seq;          /* sequence number */
    uint32_t th_ack;          /* acknowledgement number */
#if (LIBNET_LIL_ENDIAN)
    uint8_t  th_x2:4,         /* (unused) */
             th_off:4;        /* data offset */
#endif
#if (LIBNET_BIG_ENDIAN)
    uint8_t  th_off:4,        /* data offset */
             th_x2:4;         /* (unused) */
#endif
    uint8_t  th_flags;       /* control flags */
#ifndef TH_FIN
#define TH_FIN    0x01      /* finished send data */
#endif
#ifndef TH_SYN
#define TH_SYN    0x02      /* synchronize sequence numbers */
#endif
#ifndef TH_RST
#define TH_RST    0x04      /* reset the connection */
#endif
#ifndef TH_PUSH
#define TH_PUSH   0x08      /* push data to the app layer */
#endif
#ifndef TH_ACK
#define TH_ACK    0x10      /* acknowledge */
#endif
#ifndef TH_URG
#define TH_URG    0x20      /* urgent! */
#endif
#ifndef TH_ECE
#define TH_ECE    0x40
#endif
#ifndef TH_CWR   
#define TH_CWR    0x80
#endif
    uint16_t th_win;         /* window */
    uint16_t th_sum;         /* checksum */
    uint16_t th_urp;         /* urgent pointer */
};
 
/*
 *  UDP header
 *  User Data Protocol
 *  Static header size: 8 bytes
 */
struct libnet_udp_hdr
{
    uint16_t uh_sport;       /* source port */
    uint16_t uh_dport;       /* destination port */
    uint16_t uh_ulen;        /* length */
    uint16_t uh_sum;         /* checksum */
};
cs

 

 

짜란! 요것들 임니다! 우리가 yummyKit 과 같은 프로그램을 만들기 위해 계속 사용할 Ethernet ! ARP ! IPv4 ! TCP ! UDP ! 대표적인 프로토콜들이죵!! 이 외에도 총 68개의 구조체가 있으니 68개의 프로토콜에 대한 헤더가 구조체로 만들어져 있는 파일임니다!!

아아 역시 사람은 지식이 많아야함미다 ㅜㅜ 무지하니 이런것들이 있는 줄도 모르고 한땀한땀 만들면 물논 실력은 좋아질 수 있으나.. 시간을 생각했을 때 이런 정도는 시간허비가 커진다고 느껴져용 ㅜㅜ 라이브러리를 알았으면 기냥 패키지 뙇!! 다운로드 받아서 바로 include 뙇!!

 

헤더 외에도 우리에게 필요했던 ETHER_ADDR_LEN, ARPOP_REQUEST, ARPOP_REPLY 와 같은 전처리가 되어있으니 이것도 사용하면 될 것 같네욤!! 코드 가독성아 좋아져라 얍!

라이브러리만 설명하는데 포스팅 스크롤이 압박되어버렸네욥... 빠르게 다음 함수를 설명드리고 마칠게용!! 제성함미다... (((꾸벅

 

void mac_print(int init, struct libnet_ethernet_hdr *eth);

 

오옷 위 칼라스크립터 내용 복사하믄 이러케 예쁘게 나오네욧 싱기방기... (+____+) 그치만,, 이렇게라도 하지 않으면 회원쨩,, 개발 재미없다고 떠날것 같은걸!

 

온전히 함수명 그대~로 MAC Address 출력을 위함이에욤!! MAC Address 의 경우 unsigned char 형식으로 1바이트씩 6개가 이루어져 있어서 %02x 또는 %02X 로 출력해주어야 하거든요!! 또한 예쁘게 보기 위하여 MAC Address를 표기하는 AA:BB:CC:DD:EE:FF 방식을 위해 마지막 바이트에선 뒤에 ":" 세미콜론을 붙이지 않고 출력하는 것!!!

그리고 위 함수를 처음 들어갔을 때 init 이라는 정수형 변수를 통해 if 조건 분기를 타게되는데, 이것은 Source MAC Address 인지 Destination MAC Address 인지 구별을 위함이에욤!! libnet_ethernet_hdr 구조체를 이용했기 때문에 출발지와 목적지의 변수가 달라서 따로 써야하거든뇸!!

 

오늘 왠지 스크롤 압박이 되었네욥.. 히히 다음번엔 온전히 main 함수를 분석하여 실제로 첫 번째 사진과 같이 live packet capture 프로그램을 만들어보아욤!! 오늘은 월요일 아침 6시이니 월요일 좋다는 짤과 함께 다음 포스팅에서 뵈어욥 뿅!!

 

'yummyKit - Hacking Tool' 카테고리의 다른 글

[yummyKit] 브리핑 5일차  (0) 2018.11.29
[yummyKit] 브리핑 4일차  (0) 2018.01.02
[yummyKit] 브리핑 3일차  (2) 2017.09.29
[yummyKit] 브리핑 2일차  (4) 2017.09.14
[yummyKit] 브리핑 1일차  (0) 2017.09.07