'야매!개발'에 해당되는 글 50건

야매!개발







안녕하십니까?

저는 개인적으로 chobits라는 OS를 분석하면서

굉장히 신기했던것이 말입니다.

Visual Studio C++로 컴파일 링크한

실행파일을 OS 커널 이미지로 사용하는 것이였습니다.







chobits.bin이라는 파일은

실은 실행파일입니다.

PE파일입니다.

참 신기하지 않습니까?

어떻게 PE파일을 커널파일로 바로 사용한것인지 말입니다.



이번 실험에서는

쵸비츠가 어떻게

Visual Studio에서 만든

실행파일 그자체를 어떻게

커널로 사용할 수 있는 것인지

그 비밀(?)을 알아보도록 하겠습니다.^^!!!



원래 Visual Studio를 이용해서 실행파일을 만들면...

보통 이렇게 만들어집니다.

그리고 실제 사용시 메모리에 재배치되어 사용됩니다.

그러니까..

파일상의 OFFSET(위치)와

메모리의 실제 배치되는 위치는 다르게 됩니다.





이렇게 말이죠^^!!

옆에 PE파일은

메모리에 적재되면서..

위치가 재배치 되는게 일반적인 것입니다.














일반적으로 PE파일을 사용하기 위해서는

PE 파일 Loader같은 것을 만들어서

섹션(section)별로 메모리에

재배치를 해주는 것을 해줘야 합니다.




PE파일 로더의 역할은

PE파일을 해석해서 메모리에 로딩합니다.





이런 재배치는

PE파일(실행파일)의 Header정보를 기준으로해서 이루어집니다.





위 정보들은 PE파일의

“IMAGE_NT_HEADERS”정보 중

“IMAGE_OPTIONAL_HEADER”정보입니다.

이 정보들을 이용해서

PE 로더가 PE파일을 로딩합니다.




그런데,

여리님이 2003년에 만들었던 쵸비츠

(지금 2017년이니 10년도 넘은 이야기네요;;;

세월 참 빠르네요...ㅎㅎㅎ)

을 보면, PE로더의 섹션 재배치없이도

실행이 잘되는 것이였습니다.


이게 어찌된 일이니지 확인봅시다요~!!









쵸비츠에서는 이런식으로 PE파일을 로딩합니다.


음..Image Base 0x20000에

PE파일을 적제하면 끝!!!

이게 여리님이 만들었던 쵸비츠의 커널파일로더의 역할

이였습니다.

0x20000에 쵸비츠 커널 로딩!!끝!!!










쵸비츠 커널로더 참 간단하죠?
이게 어떻게 가능한 것인지~~?????

궁금하시죠^^?










여러분 미친감자가

쵸비츠의 커널로더의 비밀을 알아냈다고 합니다.

이것 저것 엄청난 실험을 해봤다고 합니다 .



















재배치를 하지 않도록 하는 그 비밀의 키는

그것은...

“align”이였습니다.















이 놈을 “512”로 해주니까...

뭐..

파일위치와 메모리 재배치 없이 사용할 수 있는

실행파일이 만들어지는 것을 확인했습니다!!!

















Microsft MSDN에서 / ALIGN에 대한 설명입니다.

/ALIGN 옵션은 프로그램의 선형 주소 공간 내에서 각 섹션의 맞춤을 지정합니다. number 인수는 바이트 단위로 지정하며 2의 배수이어야 합니다. 기본값은 4K(4096)입니다. 링커에서는 맞춤으로 인해 잘못된 이미지가 생성되는 경우 경고를 표시합니다.

출처 : https://msdn.microsoft.com/ko-kr/library/8xx65e1y.aspx

기본값이 4K(4096byte)라고 합니다 .









알것죠^^ㅎㅎㅎ

이렇게 하면...

/align:512 로 해주면...



이렇게 되는 것입니다.

그냥 PE 파일을

Image Base 0x20000 메모리 주소에

그냥 올리면 끝!!!

ㅎㅎㅎㅎ







다음 실험은 쵸비츠(chobits)의 소스를

변경해서

“migam_os”가 나오게 한것입니다.

ㅎㅎㅎㅎ

자~~실제 잘 표시되는지도

확인해보겠습니다.(이게 별것 아니지만,

굉한것입니다.

초단간 커널로더가 가능게 해주는 기술이니 말입니다.ㅎㅎㅎ)

음...새로만든 커널을 fdd 이미지 파일에

집어 넣고

실행하는 화면입니다.^^


맨 마지막 화면에서

“migam_os”가 나올 것입니다.^^


이렇게요^^

성공!!!

























음...

align의 기본값는

4kbyte입니다.


/align 이라는 옵셥을 한번 제거해볼께요..

어떻게 되는지 확인좀 해봅시다.(진짜 4K인지 확인해보자구요)



링커에서 /align 옵션을 제거하고

만들어진 실행파일입니다.

Section Alignment는 0x1000(4096byte)이고

File Alignment는 0x200(512byte)로 되었네요.


예..../align의 기본값은 0x1000(4096byte) 맞네요!!!

(이 미친감자는 의심쟁이 ㅎㅎㅎㅎ)













“/align: 512”으로 하고 링킹을하면,

PE파일의

Section Alignment과 File Alignment의 값이

둘다 512byte가 되는 것입니다!!!










/align: 512를 해줌으로

섹션 얼라인먼트와

파일 얼라인먼트가

동일하면 되는 것입니다.















미친감자 여기서 멈추면 안되겠죠~!

/align값을 다양한 값으로 바꾸는 실험을 시작해보겠습니다.




#실험1 : 링커의 /align 값을 256byte로 바꿔보겠습니다.



자...PE파일을 확인해보겠습니다.^^

자 어떻게 값이 설정 되었을까요^^?


Sectino Alignment와 File Alignment 모두

0x100(256byte)이라는 점~~

512byte이하인 경우

둘다 같은 값이 되는 것 같네요..













그럼~

근단적인 값 한번 세팅해보겠습니다.

“1”로 해볼까요?

2의 배수가 아니니 에러가 발생하겠죠^^?

과연~~~???

자 어떻게 될까요^^???

.

.

.

.

.


에러가 발생했습니다. ^^;;;;

당연한거지~~!!!














그런데 에러메시지가 좀 이상합니다.

“오류 LNK1164 0x1 섹션 맞춤(4)이 /ALIGN 값보다 큽니다.”


섹션 맞춤이 /ALIGN 값보다 크다고????

섹션 맞춤의 값이 몇일까?


그렇다면...

/align:2로 해보겠습니다.


자 바로 빌드~~!!

.

.

.

.

.

역시 에러!!!











그렇다면

/align:4로 해보겠습니다.(2의 배수로 해야 하니^^)

자 이번에는 어떻게 될까요^^


.

.

.

.

.

?

또 에러!!!

입니다;;;;;;


그런데, 에러 문구가 틀려졌네요;;;

“오류 LNK1164 0x9 섹션 맞춤(16)이 /ALIGN 값보다 큽니다.”



섹션 맟춤(16)이라고 되어 있네요

아까는 (4)였거든요^^

음...그렇다면 이젠










/align:16으로 해보겠습니다.

ㅎㅎㅎㅎ

자 이번에는 성공할까요^^???

.

.

.



.

.

.

.

.


와우~~성공^^!!!!

/align:16으로 하니께~~

성공이네요!!!!!










/align:16이 최소로 설정할 수 있는 값일까요^^?

그렇다면

다시 실험~~!!

/align:8로 해보겠습니다.

ㅎㅎㅎㅎ

자 어떻게 될까요^^?

ㅎㅎㅎ

.

.

.

.

.

.



실패입니다.;;;







그렇다면

/align:15로도 해보겠습니다.

ㅎㅎㅎ미친감자 아닙니까^^!!!ㅎㅎㅎ

자..어떻게 될까요^^?.

.

.

.

.

..

.


ㅋㅋㅎㅎㅎ당연히 에러겄죠^^ㅎㅎㅎ

.

.

.

.

.

.


허거덕;;;;;성공입니다;;;;;;;;

/align:15인데;;;말입니다.;;;;허거덕;;;;

(2의 배수로 설정해야 한다고 했는데)

뭐지???

직접 파일을 확인해봐야겠네요;;








뭐여;;;;그냥 기본값으로

만들어졌고만;;;



Section Alignment : 0x1000(4096byte)말입니다.



이건 /align:15가 아니지 말입니다.;;;;;

에러구만..아니

버그구만요;;;;;;

버그!!!!

실망이네요;;;;






자 그러면

/align:16으로 했을때

PE값의 내용을 확인해보고 이 실험은

마무리 하겠습니다.

음...0x10(16byte)로

정확히 되었네요^^







[[결론!!!]]

/align:512로하면

Section Alignment와 File Alignment가

동일한 값이 되며

메모리 재배치가 필요없어집니다.









그리고,/algin의 최소값은?

.

.

.

16

이라는 것~^^!!!

/align:16이 설정할 수 있는 align최소값입니다.




[(주관적으로)  버리기 아까운 자료들]

  • chobits Visual Stdio 2015 링커 파라메타

^D:\TMP\TEST001.001\TEST001\RELEASE\6845CRT.OBJ|D:\TMP\TEST001.001\TEST001\RELEASE\TEST.OBJ|D:\TMP\TEST001.001\TEST001\RELEASE\VSPRINTF.OBJ

/OUT:"D:\TMP\TEST001.001\RELEASE\CHOBITS.BIN" /VERBOSE /NOLOGO ENTRY.OBJ HAL_ASM.OBJ /NODEFAULTLIB /MANIFEST:NO /PDB:"D:\TMP\TEST001.001\RELEASE\TEST001.PDB" /ASSEMBLYDEBUG /SUBSYSTEM:CONSOLE /OPT:NOREF /OPT:ICF /TLBID:1 /ENTRY:"EntryPoint16" /BASE:"0x20000" /DYNAMICBASE:NO /FIXED /NXCOMPAT:NO /IMPLIB:"D:\TMP\TEST001.001\RELEASE\TEST001.LIB" /MACHINE:X86 /SAFESEH:NO RELEASE\6845CRT.OBJRELEASE\TEST.OBJRELEASE\VSPRINTF.OBJ


이것 굉장히 어렵게 잡아낸것입니다 .ㅎㅎㅎ

(link.exe가 종료하면서 없어지는 정보입니다.link.exe를 발견하면

suspend시켜가지고 잡은 내용이지요)

여기에서 중요한 옵션은

/NODEFAULTLIB

/SUBSYSTEM:CONSOLE

/ENTRY: “EntryPoint16”

/BASE: “0x20000”

입니다.










  • chobists Visual C++ 6.0 링커 파라메타

# ADD LINK32 entry.obj /nologo /base:"0x20000" /entry:"EntryPoint16" /subsystem:console /map /debug /debugtype:coff /machine:I386 /nodefaultlib /out:".\disk\chobits.bin" /DRIVER /align:512 /FIXED

여기서 /align 이라는 옵션이 중요함!!!








  • /align: 512로 했을 때 성공화면^^;(버리기 아까워)

이것 저것 하다 드디어 성공했던 화면입니다.

분명히 그 순간에 화면캡처한 화면 맞습니다.^^!!!



이 코드가 실행되어 화면에 표신된것입니다.^^





이 글자를 너무 쉽게 생각

하시면 안됩니다...

ㅎㅎㅎㅎ

부트섹터를 지나

GDT를 설정하고

보호모드로 변경하여~

B8000 비디오카드에

데이타를 Write한 것이라는 것

ㅎㅎㅎㅎ



ㅎㅎㅎㅎㅎ 할렐루야!

미친감자의 /align 실험은 여기까정~~~







0 0
야매!개발

음...

link.exe를 이용해서 직접 실행파일을 만들자...

링킹을 하자요~~







CL /c FIRST.C SECOND.C THIRD.OBJ

LINK firsti.obj second.obj third.obj /OUT:filename.exe

 

https://msdn.microsoft.com/en-us/library/8we9bhf4.aspx

이렇게 하면

command line에서도

컴파일 링킹이 가능합니다.


자..command line에서

쵸비츠 파일들을 컴파일 및 링킹을 해보겠습니다.


자~~!!







test1.c 이라는 녀석을

“cl /c test1.c”

로 컴파일 했더니..

stdio.h를 포함 시킬 수 없다고 그러네요;;;;

이런...











이것을 해결 하는 방법은

stdio.h와 같은 헤더파일이 어디에 있는지

환경설정이 되어 있어야 합니다.



위 그림처럼

Visual Studio가 제공해주는 것을

사용하시면 간단하게 해결됩니다.















보이시죠^^

환경변수에 “INCLUDE” “LIB”

이 값이 설정되어 있어야

컴파일러가

링커가 기본라이브러리들을

사용할 수 있는 것입니다.



















자. 그러면...

다시 컴파일 해보겠습니다.

test1.c를 컴파일 합니다.

“/c”옵션을 이용해서 컴파일만 하는데, 문제 없이 되었습니당!!!









test1.obj파일 보이시죠^^?

















자....

이제...

test2.c를 컴파일 하겠습니다.











test2.obj파일도 잘 만들어졌습니다.















이제 링킹만 하면 됩니다.

“link test1.obj test2.obj /OUT:test.exe”

를 입력하면 링킹이 됩니다.^^


















실행도 해보았습니다.

실행도 아주 잘 됩니다.











다음에는...

cl.exe와 link.exe를 이용해서

OS 커널을 빌드해도록 해보겠습니다.


그럼 다음에 뵈요^^

감사합니다.


0 0
야매!개발

 

안녕하십니까? 불광불급 미친감자입니다.

오늘은 토요일 아내가 일어나기 전에...잠간의 짬을 이용해 블로깅 해보겠습니다.

흐....

흐..뭘해야 좋을 까요?

딱 10분이 저에게 주어졌습니다.

 

음...코텍스에 대해서 조금 공부해보죠

코텍스 구조에 대해서 구글림을 10분동안 하면서...

블로깅을 해보겠습니다....

 

할렐루야..

 

성령님...도와주세요...

할렐루야~~~~

오늘은 이 그림으로

블로깅 완성~~~

코텍스 내부에 있는 버스라고 합니다.

빠이 빠이

벌써 10분이지났어요;;;;

다음 기회에 뵈요^^;;;

http://www.jkelec.co.kr/img/lecture/cortex_arch/cortex_arch_2.html

더 보고 싶은 분들은 위 링크를 보시고 공부하시면 됩니당~~~~~

0 0
야매!개발


안녕하십니까 불광불급 감자 입니다.

오늘 5분의 짬이 생겨서요...







 

또 뻘짓을 하려고 합니다.

 

이녀석의 기계주소를 알아보고자 합니다.

이 녀석은.. 그 유명하신

포켓몬고 플러스란 녀석입니다.

 

이 녀석의 기계주소...

맥주소라고 보통 하죠?

그 주소가 어떻게 되는지 확인해보도록 하겠습니다.

 

어떻게 알아낼 수 있을까요?

 

흐..저는 노르딕...nRF52x 개발보드가 있어서거 가능합니당;;

죄송해요..없는 분들은 다른 방법이 있을겁니다.

 

 

자.보입니다.

98:b6:e9:19:6c:57 이네요..

“Pokemon GO Plus”

 

 

 

자 그러면...

98:b6:e9:xx:xx:xx 는 어떤 회사일까요?

구글링 해보겠습니다용~~!

 

 

닌텐도였군요...

98:b6:e9는 닌텐도회사에서 만든 놈이였군요..

그렇지..

포켓몬을 닌텐도에서 만들었으니?

그렇죠?

닌텐도에서 포켓몬 만든것 맞죠?

그럼 말이 되죠?

 

오늘은 여기까정~~!!

 

 

다음에 또 봐요 여러분~~불광불급 감자였습니다 .

 

 

 

0 0
야매!개발/리눅스

리눅스 병맛 강의의 강사 미친감자 입니다.


음...리눅싀 파일을 tar로 묶는 것을 실습하겠습니다. ㅎㅎㅎ

나이 먹고 시작해서 그런지 항상 까먹습니다. ..참고로 저는 현재 44입니다. ㅋㅋㅋ


음..참 짭죠~!!!

아들아... tar로 파일 묶을 수 있겠지^^?


참 쉬워요..


tar cvf 만 외우면 되요..


타르 씨브이에프

씨브이 에프

씨브이에프

씨브이에프

씨브이에프...


씨~~~브이~~~에프~~


참 쉽죠~~!

우리 아들이 좋아할 까 모르겠다...




tar cvf  파일명.tar  디렉토리

예~ 그러게요..너무 허접하네요;;;;

죄송해요 다음엔~~좀더 멋지게 해볼께요~~;;;;




0 0
야매!개발/리눅스

미친감자입니다.

오늘도 “기술”로 재밌게 글을 써보겠어요~!


Holy Spirit

Help me



리눅스에서...

현재경로를 저장하고 있는 환경 변수는 뭘까요^?

갑자기 궁금해졌습니다. ㅎㅎㅎㅎ


현재경로을 알아낼 수 있는 명령은

“pwd”라는 명령이 있죠^^~!


자~ 먼저 pwd명령을실행해 보겠습니다~!!




그런데, 저 값이 들어가 있는 환경변수가 뭔지 궁금해지는 군요..

자 환경변수를 만나로 가겠습니다.


@localhost:~$ pwd

/home/migam

@localhost:~$ echo ${PWD}

/home/migam

@localhost:~$ echo $PWD

/home/migam


$PWD

자 애니메이션으로 다시 보시죠^^~~

그래야 살아 있는 것 같잖아요~~!!





딸라 표시하고 대문자로 PWD하면...

되는 구나~~!


그런데

환경변수를 확인하기 위해서

왜?

“$” 딸러를 쓸까?


show me the directory!



pwd의 의미는


print working directory 이구먼;;;


working 워킹~

작업하고 있는 곳이

현재 디렉토리인가?


그렇지~~~~


ㅎㅎㅎㅎㅎ


[참고한 문서...]

https://ko.wikipedia.org/wiki/Pwd



0 0
야매!개발/리눅스


작품 201170301-001

작품명 : BeHoly-001

작가 : 비홀리 미친감자 김주생

자칭 컴퓨터 프로그래밍 아티스트ㅋㅋ



요즘 저는

리눅스라는

친구를

알아가 고 있어요...



리눅스..ㅎㅎㅎ



이 친구는...


파일이라는 녀석(?)^^이


참...


중요하더군요...


파일!!



파일 시스템이라고 하더군요



파일 시스템


File System


그중에 특별한..


친구들이 있어요..


그중에....


오늘은 이 친구를 알아 볼까 합니당~~!!




바로 이 친구 ^_^!!!



이 친구죠~~!!


시스 에프 에스~!!


sysfs


sys은 시스템(system)을

이야기 하는 것 같구요..


fs는 당연히

file system인 거죠



그러니께...


system을 파일로 표현하는 것입니다.


시스템이 뭔지 아시죠?


커널이라고 볼 수 있어용~!!



커널을 파일로 확인할 수 있고

그리고, 파일로 Write 할 수 있도록

해주는 친구인것 입니다.


참 멋지죠~~!!

출처 : 구굴링 이미검색

아닌가?

ㅋ~

아니면 말구요.

(아이구 죄송합니다.

더 공부하고 알려드릴께요~~)




자 함께 좀더 구경해볼까요?

sysfs 라는 친구를요~~!!


자 봅시다.

“/sys” <-- 이 친구^^

sysfs의 실체 입니다.

그 안엔 위 그림처럼

여러 녀석들이 살아 있습니다.

ㅎㅎㅎㅎ


이 중에 어떤것을

확인해 볼까요^^?


음... 가장 위에 있는


/block 이라는 이 친구를

확인해봅시다.


자 들어갑니다...


에게

음.. ~sda

너 밖에 없냐?


더 들어가보자...

오~~이제 뭐가 많이 나왔어요~~!

그런데 많이 나오니께..

부담 스럽네요...

ㅎㅎㅎㅎ

이런 간사한 인간이여;;T T


음.. 찬찬히 째려봅시다용~!!


이렇게요~~


보이시나요???


일단 디렉토리를 쨰려보겠습니다.


음...음...음...


비디아이(bdi)~~디바이스(device)~~

홀더스(holders)~~~~너~~~

파워(power)~전력??~~~큐(queue)~~~

세스디아이원(sda1)~세스디아이투(sda2)~세스디아이파이브(sda5)~~슬레이브스)(slaves)~~

서브시스템(subsystem)~~~너!!!!~~~트레이스(trace)~~~!!


에잇!!! 뭐여?

더 모르겠네요...ㅎㅎㅎㅎ


자~~그래도 포지하지 맙시다.

도전~~!!

하지 말고


이제 파일이나 쳐다보자고요...

음...


오늘은 여기까지...

아이구 죄송합니다.


일단 저의 작품은 공개를 목적으로 하기때문에..

부족하지만 일단 공개!

ㅎㅎㅎ

그래야 제가 캐미(?)가 계속 발생하더라구요...





0 0
야매!개발/리눅스

우분투에서 ftp server를 작동시키자...


일단 구굴링을 했죠~!

그런데 안됩니다.;;;; 이 죄인이 또 어떤 실수를 했나요 주인님~~????


이런 접속이 안된다.;;;;

뭐가 문제일까?

뭐가 문제지?


파일 질리 클라이언트로 접속아니께..~~~

chroot() 리스트를 읽을 수 없다고....에러를 뱉는군요...


응답: 331 Please specify the password.

명령: PASS ****

응답: 500 OOPS: could not read chroot() list file:/etc/vsftpd.chroot_list <--



holyhacker@spirit:/etc$ ls vsftpd.* -ls

4 -rw-r--r-- 1 root root   11  8월 16 13:05 vsftpd.chroot_list

8 -rw-r--r-- 1 root root 5676  8월 16 11:00 vsftpd.conf



vsftpd.chroot_list를 만들어줬더니..


잘 접속된다!!!


그렇구나..

vsftpd.chroot_list 에

holyhacker라고 지금 쓰고 있는 아이디를 적었더니..


아주 잘 접속이 됩니다.!!!


ㅎㅎㅎㅎ;;;;




상태: 10.2.X.XXX:21에 연결...

상태: 연결 수립, 환영 메시지를 기다림...

상태: 보안되지 않은 서버입니다. TLS를 통한 FTP를 지원하지 않습니다.

상태: 로그인

상태: 디렉터리 목록 조회...

상태: 서버의 시간대 오차 계산...

상태: 서버의 시간대 차이는 0초입니다.

상태: "/home/holyhacker" 디렉터리 목록 조회 성공


오~~~ ㅎㅎㅎ 되네요...주인님...


또...교만한 죄인을 용서하소서 주인님...



참고 URL

http://webdir.tistory.com/199

http://squall.kr/70




0 0
1 2 3 4 ··· 7
블로그 이미지

I believe in risen.

얄리얄리얄리