* gdb를 사용한 실행파일 디버깅하기 *




보통 보안이나 해킹에서 보면 실행파일을 까 보는? 경우가 있습니다. 물론 제가 아직 거기까지 통달하지는 않았지만


역시나 오늘도 기록을 위해서 포스트를 작성해 보도록 하겠습니다.



일단 C언어를 사용한 코드를 하나 작성해 보겠습니다.



> touch shell.c


> nano shell.c



(source)

#include <stdio.h>


int main() {

int a = 10;

int b = 20;

int result = 0;


result = a + b;


return 0;

}



사실상 stdio.h 헤더는 사용하지 않았지만 버릇처럼 넣어버렸습니다...


아주 간단한 코드입니다.


a 에 10을 넣고 b 에 20을 넣고 그 값을 result 라는 4바이트짜리 변수에 넣고 종료


이것을 이제 gcc 를 통하여 실행파일로 컴파일 해보겠습니다.



> gcc -o shell shell.c


-o 옵션은 컴파일한 출력 파일의 이름을 지정해주는 옵션입니다.


단순히 gcc shell.c 로도 할 수 있지만, 이 결과는 a.out 리는 실행파일이 나오게 됩니다.


출력문 printf 를 쓰지 않았기 때문에 당연히 아무 반응도 없습니다.


==============================================================================


이것을 이제 gdb(GNU Debugger) 를 통해 디버깅을 해서, 어셈블리 코드로 바꿔서 결과를 보겠습니다.




> gdb shell


(gdb) > disass main


disass main 의 의미는 disassemble main 의미입니다.


즉 main 메소드를 역어셈블 한다는 뜻이죠.


한줄한줄 살펴볼까요?



==============================================================================



1. <+0>:    push   %rbp


이 1번줄과 2번줄은 어셈블리에서 항상 나오는 표현입니다.


레지스터 rbp를 스택에 넣어두고, rsp를 rbp에 넣어줍니다.


참고로 윈도우와는 다르게 리눅스에서는 source 와 destination 의 위치가 바뀝니다.



즉, add %r1, %r2 가 윈도우에서는


r1 = r1 + r2


이었다면, 리눅스에서는


r2 = r2 + r1


이 됩니다. 헷갈리실 수도 있으니 꼭 참고하세요.




2. <+1>:    mov    %rsp,%rbp


네, 아까 말씀드린 것처럼 어셈블리에서 항상 나오는 표현입니다.


1번줄과 2번줄은 외워두시는 것도 좋습니다. 저는 이미 외웠습니다.




3. <+4>:    movl   $0xa,-0xc(%rbp)


본격적인 main함수의 표현입니다.


movl $0xa, -0xc(%rbp)


언뜻 봐도 0xa(=dec. 10) 의 값을 %rbp 에 넣어주는 표현인 것 같습니다.


그런데 왜 -0xc 를 해줄까요? 분명히 int 는 4바이트(=0x4)인데?




어셈블리어 익숙하신 분들은 눈치채셨을 수도 있습니다.


저는 ARM M1 Cortex 시리즈를 학교에서 공부하면서 ARM 어셈블리 문법을 공부했었는데,


거기서 배운 것 하나가 여기서 도움이 되네요.



역어셈블 과정에서 디버거는 변수의 개수를 셉니다.


main 함수를 보시면 int 변수가


int a

int b

int result


이렇게 3개가 나옵니다.


즉, 4바이트 * 3 = 12바이트 (=hex. 0xc)


라는 공간을 "미리" 할당합니다.




아래 그림을 한번 봅시다. (byte address 로 하지말고 4byte 어드레스라고 가정합니다. 즉 1칸에 4바이트)


               [rbp]

4byte

4byte

4byte

 

 

 

 



이렇게 3칸(12byte)을 할당해 줍니다.


그리고 나서, 변수가 나오는 순서에 따라서 맨 아래서부터 메모리 위치를 배정해줍니다.


int a = 10;


즉, 10의 값(=hex. 0xa) 을 맨 아래인 rbp - 12byte 위치에 넣어줍니다.


이것을 어셈블리로 표현하면


movl    $0xa, -c(%rbp)


가 되는 것입니다.




4. <+11>:    movl   $0x14,-0x8(%rbp)


위의 3번줄에서 설명한 것 처럼, 다음 변수는 -12 바이트 위치가 아닌,


4바이트가 줄어든 -8 바이트 위치에 할당해줍니다.


다음 변수는


int b = 20;


입니다. 즉, 20의 값을 -0x8(%rbp) (=%rbp - 8byte) 에 넣어줍니다.


20은 hexa 값으로 0x14 입니다. (1 * 16 + 4 * 1)




5. <+18>:    movl   $0x0,-0x4(%rbp)


똑같습니다. 마지막 변수는 int result = 0; 이므로,


0의 값을 -4바이트 줄어든 위치에 넣어줍니다.




6. <+25>:    mov    -0xc(%rbp),%edx


이 것은 계산을 위해서 값을 옮기는 과정입니다.


계산 식은


result = a + b;


해당 인수들의 주소는


&a = -0xc(%rbp)


&b = -0x8(%rbp)




여기서는 %rbp - 0xc 위치에 있는 값(=10)을 edx 레지스터에 넣어주었습니다.




rbp 에서 직접적으로 계산을 하지 않고 edx 와 eax 같은 범용 레지스터에 임시적으로 옮겨놓고


계산을 한 후 그 결과 값을 다시 rbp에 가져오게 됩니다.


쉽게 생각해서, 값을 보존하기 위해서? 라고 생각하시면 되겠습니다.




ARM 어셈블리를 배울 때도, 메모리에서 직접적으로 계산을 할 수가 없기 때문에


값들은 메모리에 넣어 놓고 필요한 값만 r1, r2, r3 등의 범용 레지스터에 옮겨서 계산 후 다시 메모리에 넣었던 기억이 납니다.




7. <+28>:    mov    -0x8(%rbp),%eax


6번줄과 마찬가지로 rbp -8byte 의 위치에 있는 값(=20)을 eax 레지스터에 넣어줍니다.


8. <+31>:    add    %edx,%eax


계산입니다.


eax = eax + edx


eax 에는 20이 들어가 있었고, edx 에는 10이 들어가 있었죠.


최종적으로


eax = 20 + 10


과 동일합니다.


eax 에 결과 값 30이 들어가게 되겠군요.




9. <+33>:    mov    %eax,-0x4(%rbp)


계산이 끝났으니 값을 옮겨줘야겠죠?


eax 레지스터에 있는 값을 -0x4(%rbp), 즉 %rbp - 4byte 위치에 넣어줍니다.


저희는 이미 위의 과정들을 통하여 어떤 변수(값)가 어느 위치에 있는지 알고 있습니다.


rbp에서 4byte 줄어든 위치는 result 변수가 할당되어 있는 자리입니다. (5번줄 참고)


즉, result 변수에 eax 레지스터의 값, 30이 들어가게 됩니다.




10. <+36>:    mov    $0x0,%eax


사용한 도구는 닦아줘야죠.


eax 레지스터를 초기화 해줍시다. 다음에 있을 연산이나 작업을 위해서요.


항상 초기화는 습관을 들여줍시다.




11. <+41>:    pop    %rbp


모든 프로그램이 끝났습니다. 1번줄에서 stack memory 에 save 해 두었던 값을 rbp 에 다시 옮겨줍시다.


12. <+42>:    retq  


return 0; 의 의미입니다.





==============================================================================




굉장히 쉬운 어셈블리 였습니다. 실제로 보안업무를 진행하시는 분들은 몇 백 줄의 C언어 코드를 역어셈블 해서 보실텐데, 이런 코드는 정말 맛보기일 뿐입니다.


그래도 gdb 를 사용하고, 역어셈블과 어셈블리 언어를 관찰했다는 것에 의의를 두었습니다.



>>> gdb


>>> 리눅스 어셈블리


>>> 리눅스 역어셈블


>>> GNU Debugger

Posted by NDC :

* 해커스쿨 강의만화 기록_4(고등학교 단계) *


마지막으로 4편, 고등학교 단계입니다.


이번 편에는 cmd 상에서 ping 명령어를 통해 단말기 유무를 판별하는 것을 보여주었습니다.



==============================================================================================


지식의 출처는 해커스쿨입니다. 감사합니다. 문제 될 경우 필히 삭제하도록 하겠습니다.


==============================================================================================



[컴퓨터 알아내기]

동일 네트워크 상 = 끝자리 하나만 다름

ex. 192.168.0.13 and 192.168.0.16 이런식(1~255)

cf) 192.168.0.1 과 같이 끝자리가 1은 거의 대부분! GateWay 로 쓰인다.


*** route 명령어 ***

Link = https://m.blog.naver.com/PostView.nhn?blogId=ys9922&logNo=90069129492&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F

********************


[ping 반복 c코드]

#include <stdio.h>


int main() {

int i;

char cmd[40];


for(i = 1;i<=255;i++) {

sprintf(cmd, "ping 192.168.0.%d", i);

system(cmd);

}

}


+ 핑 한번때리는 옵션:-c 1

sprintf(cmd, "ping -c 1 192.168.0.%d", i);


+ grep 으로 걸러내기:|grep from -> 응답이 있는 것은 from 이라는 문자열이 들어가기 때문.

sprintf(cmd, "ping -c 1 192.168.0.%d|grep from", i);


[구체적인 조사]

운영체제, SSH와 같은 포트의 오픈여부?

TTL값도 알아야함.

TTL? Time To Live, 패킷의 유효시간.

TTL=3은 최대 3개의 라우터를 거쳐갈 수 있다.

TTL 값의 존재 이유? 영원히 돌아다니는 패킷을 방지하기 위해

윈도우의 TTL = 100~128

리눅스의 TTL = 50~64


SSH = 22 port

SSH를 사용한다? => 22번 포트가 열려있다.

X-windows  = 6000번 퐅,

X-windows를 사용하지 않는다? => 6000번 포트가 닫혀있다.


-> telnet (대상의 IP주소) (포트번호)

열려있다?->허가됨

닫혀있다?->거부됨(refused)

ex. 

> telnet 192.168.0.13 22

Posted by NDC :

* 해커스쿨 강의만화 기록_3(중학교 단계) *


이번에는 3편, 중학교 단계입니다.


이번 편에는 프로그램의 전반적인 모습, 가장 기본적인 개념에 대해서, 메모리란 무엇인가? 에 대해서 다룬 것 같습니다.



==============================================================================================


지식의 출처는 해커스쿨입니다. 감사합니다. 문제 될 경우 필히 삭제하도록 하겠습니다.


==============================================================================================



[언어]

기계어-어셈-포트란(이때 고급언어 첫등장)-코볼-베이직-비

-씨-씨플플-HTML(+PHP)-python,delphi,java 등

미국 표준협회(ANSI) 에서 C언어의 표준안 발표(1990) -> ANSI-C


사람-c언어 작성(*source code*)-컴파일러(C언어->기계어(*binary code*))-컴퓨터가 보고-동작(프로그램)


패키지가 있나없나?

> ls /usr/bin/(package name)

ex. ls /usr/bin/gimp

있으면 경로 출력, 없으면 No such file or directory(오류뜸)


*** /usr/bin/ 에 대해

ex. > touch a.sh 라는 쉘 스크립트 하나 만들었다.

> chmod 777 ./a.sh

이 쉘스크립트를 실행시키려면? 경로입력을 일일히 해야한다.

경로입력없이 그냥 

> a.sh

로만 실행시키려면?

> sudo mv ./a.sh /usr/bin/

=> /usr/bin/ 경로에 넣어라!

그러면 경로를 입력하지 않아도 바로 실행된다.


[소스코드 입력]

1. cat > main.c - 이후 소스코드 입력하고 완료 후엔 Ctrl+d

but, 입력한(엔터를 친) 부분이 수정불가한게 단점.

2. nano 혹은 gedit, vi 등 CUI 기반의 텍스트 에디터 사용


컴파일

> gcc -o main.out main.c -> 실행파일:main.out

> gcc main.c -> 실행파일:a.out


[vi editor]

1.명령모드 2.편집모드 3.라인모드

> touch main.c

> vi main.c

이후 보이는 화면은? 


3.라인모드

:w = 저장

:q = 나가기

:q! = 세이브 없이 강제종료

:wq = 세이브 하고 종료


[메모리]

Ram = Random Access Memory,임의 접근 기억장치

속도가 빠르다(전기 신호), 하지만 전기 신호로 정보를 기록하기 때문에

컴퓨터 종료 시 사라진다.

HDD 는 금속 판에 자성 물질을 입혀서 저장 = 속도가 느림. 하지만 대용량(물리적 공간)

Rom = Read Only Memory, 읽기 전용 기억장치


Ram은 빠르다, 하지만 빈 공간에 저장해야 한다(덮어씌워지면 이전 정보가 사라짐)

프로그램들은 메모리에 접근하기 전에 빈 공간을 요청해야 함.(메모리 할당)

1byte = 8bit(8개의 자릿수를 의미)

@@@@ @@@@ 에서 @는 1bit, @@@@ @@@@는 1byte

@에는 0 or 1이 올 수 있다.


예외)ARM Assembly 에서는 메모리에서 @@ 이 1byte, 이는 Hexa 값이기 때문에 2의 8승, 즉256개의 정보가 들어간다

(0x00 ~ 0xFF) = @를 풀어서 보면? xxxx 와 동일, x에는 0 or 1이 올 수 있다. 


즉, bit 는 자릿수다

n bit = 자릿수 n개

Posted by NDC :

* 해커스쿨 강의만화 기록_2(초등학교 단계) *


이전의 1편에 이어서 이번에는 초등학교 카테고리의 강의만화를 정리한 것들을 올리겠습니다.



==============================================================================================


지식의 출처는 해커스쿨입니다. 감사합니다. 문제 될 경우 필히 삭제하도록 하겠습니다.


==============================================================================================



[운영체제]

컴퓨터에서 어떤 작업이라도 하기 위한 가장 기초적인 프로그램

Bell 연구소의 UNIX 운영체제 개발(어셈블리어, 이후 UNIX는 C언어로 재개발된다)

-> 워크스테이션급의 고성능 컴퓨터를 위한 무거운 OS가 일파만파 생겨남

-> DOS(Disk Operating System) 개발됨(디스크 한장에 OS가 있다)

-> 빌 게이츠의 MS-DOS 개발됨(이후 MS-Windows 로 발전)

-> Linux 출시됨(리누스 토발즈)


[리눅스]

Unix 를 모태로 개발됨.

하지만 Kernel 을 포함한 모든 소스코드는 토발즈가 독자적으로 구현.

특징

- PC(Personal Computer)에서 사용가능.

- 멀티 유저 시스템을 지원(컴퓨터 한대에 한명이 아님, 자식 낳듯이 퍼질 수 있다->서버 시스템)

- 가볍고 안정적(저사양 컴퓨터에서도 사용가능)

- 무료, 오픈소스(내 마음대로 수정 가능)

- 글로벌하게 만들어가는 OS(오픈 소스 프로젝트, 지속적이고 빠른 업그레이드)


startx 명령어:x-windows 실행.(GUI 모드, Command 는 prompt 모드라고 한다.)


리눅스의 최고 관리자:root

- 사용자 관리(추가, 삭제, 패스워드 변경 등등)

- 서비스 관리(Web, FTP, Mail 등의 서비스 설치 및 삭제)

- 시스템 종료 및 리부팅

- 기타 중요한 설정 변경(날짜/시간, 네트워크 설정, 도메인 설정 등)


GUI->CUI(=TUI 진입:Ctrl+Alt+F1

CUI->GUI 진입:Ctrl+Alt+F7


CUI를 사용해야만 하는 경우

- 원격으로 나의 Linux 서버, 혹은 다른 사람의 서버에 접속할 때

- Linux의 설정을 세부적으로 변경하고 싶을 때

- 소스코드로 이루어진 새로운 프로그램을 설치할 때

- X-Windows 에 문제가 생겨 정상적으로 부팅이 되지 않을 때

- CUI 기반의 훌륭한 프로그램등을 사용해 보고 싶을 때(nmap, nc 등)


[데비안]

이안 머독으로부터 시작


[듀얼부팅]

- 두개의 하드에 각각 윈,눅 설치

- 하나의 하드를 두개의 파티션으로 나누어 각각 윈,눅 설치

- 윈 안에 눅 설치

- 눅 안에 윈 설치

Posted by NDC :

* 해커스쿨 강의만화 기록_1(유치원 단계) *




17회 해킹캠프에 당첨되었습니다!


해킹켐프를 준비하기 위해 해커스쿨에서 대충 만화정도만 살펴보았는데


상당히 도움이 되었던 것 같습니다.

(카테고리에서 유치원~고등학교 까지입니다.)


오늘은 제가 본 강의만화들을 텍스트로 한번 정리해 보았고, 그것들을 공유하려고 가져왔습니다.

(두서없이 적었습니다. 보기 힘드시겠지만 공유에 목적을 두고 하도록 하겠습니다.)


==============================================================================================


지식의 출처는 해커스쿨입니다. 감사합니다. 문제 될 경우 필히 삭제하도록 하겠습니다.


==============================================================================================


해커스쿨 URL

http://www.hackerschool.org/Sub_Html/HS_Community/index.html

해킹캠프 URL

http://hackingcamp.org/




1. 네트워크 - IP, port, protocol, 방화벽

2. 프로그래밍 - C언어/php,asp(웹해킹)/WinAPI(윈도우즈해킹)

/POSIX C,Shell script,perl(유닉스해킹)/Assembly(기계어)

3. 운영체제 - 윈도우즈,유닉스,리눅스(서버구축,메모리,라이브러리,백도어,스텔스)

4. 수학 - 메모리주소 계산,역공학,암호학


#########################################################################################


- 인터넷,TCP/IP등 네트워크 기초 이론에 대해 학습

- 운영체제(리눅스)의 설치, 운용, 서버 구축 방법

- C언어 학습, POSIX C언어도 학습, 이후 네트워크 프로그래밍

- 해킹 기법 학습, 버퍼 오버플로우, 포맷 스트링, 네트워크 해킹, 웹 해킹 등등

- 어셈블리어 학습 후 바이너리 파일 디버깅 실습, 운영체제의 커널에 대해 학습.


#########################################################################################


[네트워크]

인터넷과 사용자를 연결시켜주는 업체 = ISP(Internet Service Provider)

Ethernet = 데이터 통신 기술의 한 종류, 초당 10Mbps

인터넷 연결 순서:집-전봇대-맨홀(지하로가서)-전화국-ISP(인터넷서비스제공자)

라우터:집에서 나온 패킷이 도착해야 할 곳을 찾아줌.

패킷:데이터와 비슷함

내가 데이터(패킷)를 송출하면 그 데이터(패킷)는 ISP의 라우터에 도달함.(ex. Cisco Router)

내가 송출한 데이터가 수신될 위치를 찾는 것이 라우터의 역할.

라우터는 인터넷 곳곳에 설치되어 있다. 

목적지를 찾는 것 뿐만이 아니라, 목적지까지 가장 빠른 길을 찾는 것도 라우터의 역할.


그럼 패킷이란?

패킷은 실생활의 소포와 비슷한 의미.

소포처럼 받는사람의 주소(=받는이 IP)와 보내는사람의 주소(=보내는이 IP)가 자동으로 기록됨.

이처럼 실제 데이터 앞쪽에 자동으로 붙는 주소같은 정보들을 Header라고 한다.

헤더+실제 데이터 = 1개의 패킷


[기본 네트워크 명령어들]

net send = 상대방 컴퓨터에 메세지를 보내는 명령어

> net send (상대방 IP) ("보낼 메세지") 이었지만...XP sp2 이후로 막힘

> msg * Hi -> 로컬 상의 모든 세션(컴퓨터)에게 Hi 라는 메세지를 보냄.

/V -> 상태 보여줌 / /W -> 응답 보여줌

그래서 보통은 

> msg *(=모든 세션) /V /W Hello!

내 컴퓨터 IP = 127.0.0.1

(Link = http://neoray.org/495#.Wohkla5l9aQ)


ping = 상대방 컴퓨터와 내 컴퓨터가 서로 연결되어 있는지를 확인하는 명령어

ex1. ping (IP Address)

ex2. ping (Domain)


ipconfig(Linux:ifconfig) = 내 컴퓨터의 IP를 보는 명령어


NETSTAT = 내 컴퓨터에 열린 포트를 보는 명령어(ex. netstat -an)


TRACERT = 내 컴퓨터에서 상대방 컴퓨터까지 이어진 경로를 추적하는 명령어

ex. tracert (Domain or IP Address)///(ex. tracert google.com)

여기서 나오는 IP들은 라우터이다.

Posted by NDC :

* 딥러닝 공부한 것 기록_1 * 


학교에서 프로젝트로 공부하고 있는 딥러닝에 관해서

나름대로 공부한 것들을 기록해보았습니다.


정확할지 아닐지는 몰라도 이 글이 도움이 된다면 언제든지 제 지식을 가져다가 쓰시길 바래요!



-------------------------------------------------------------------------------------------------------



데이터 모으는 것부터 하자(데이터 만드는 것이 딥러닝의 시작)

텐서플로우 사용(파이썬)

성능이 안나온다? -> 데이터를 보자(네트워크문제보다 데이터문제가 더 클수도)


cost function 에서 H(X) 는 그래프 선(linear)상의 값, Y 는 실제 값

제곱 : 패널티를 쎄게 줄 수 있다.


min(cost(w)) = 로스(cost)가 가장 작은 가중치(w)를 찾는 것.

=> convex 함수(볼록함수)


행렬 활용해야 한다.


시그모이드 함수와 크로스 엔트로피 코스트

H(x) = Wx일때 H(x)에 시그모이드를 쓰면 

그래프(코스트)가 이상하게 나옴.(convex,볼록 함수가 안나옴. 최소값 찾기가 힘듬)

그래서 크로스 엔트로피 코스트 함수가 나온것.

그런데 여기서 log를 사용한 코스트함수를 쓰는데, if를 빼고 모든 상황에서 사용

가능한 크로스 엔트로피 코스트 함수를 만들어 냈음.


그럼 결과가 2개 초과인 경우에는?

2차원 배열로 사용. 3개? 3X3 w행렬. 4개? 4X4 w행렬.

여기서 x1 x2 x3 피쳐값을 넣어서...(x1 = feature 1)

결과값이 0.2 20 0.7 나왔다? -> 시그모이드 사용 -> 확률로 나와짐.


정리

리니어 리그레션. 가설 H(x) -> 키-몸무게 2개뿐

3개이상? 멀티 리니어 리그레션


시그모이드에서 지수함수가 들어가는데, 그러면 이상한 그래프가 나옴.

이 그래프를 좀더 찾기 쉽게 만들어주려면 지수함수의 반대인 로그함수값이 들어가는데,

이 로그함수값이 포함된 코스트 펑션을 크로스 엔트로피 코스트 펑션이라고 부른

Posted by NDC :

파이썬 Pillow 모듈

2018. 1. 20. 08:48 from Python

* 파이썬 이미지 처리 모듈 Pillow *



컴퓨터를 사용하는 가장 큰 이유는


인간이 할 수 없는 일(사실상 불가능해 보이는 다량의 일)을 손쉽게 해결해주기 때문이라고 생각합니다.


이번에 딥러닝 연구실에서 데이터를 만드는 데 가위바위보 이미지를 각각 2500장씩 만들어야 했습니다.


모든 이미지를 128 x 128로 리사이징 해야 할 뿐만 아니라 파일명까지 팀원들과 맞춰야 했습니다.


여기서 저는 파이썬을 사용해서 손쉽게 해결했습니다.




파이썬에는 Pillow 라는 이미지 처리 모듈이 있습니다.


제가 짠 소스를 예시로 보여드리겠습니다.


===========================================


from PIL import Image


lst_image = []

for i in range(2500): # i = 0~2499

lst_image = lst_image+['Image (' + str(i+1)+').jpg']

#Image (1~2500).jpg


for i in range(2500):

im = Image.open(lst_image[i])

im2 = im.resize((128,128))

str_tmp = ('Image' + str(i+17500) + '.jpg')

im2.save(str_tmp)

lst_image[i] = str_tmp


print("Finish!")


#im = Image.open('1.jpeg')

#im2 = im.resize((128,128))

#im2.save('test2.jpeg')

#print(im2.size)


===========================================


대충 반복문을 돌려서 기존의 파일명을 리스트 변수 하나에 때려넣은 뒤, 


리스트 변수에서 인덱스를 통해 접근하면서 하나씩 리사이징 후 새로운 파일명으로 저장하는 형식의 소스입니다.


Pillow 모듈의 함수를 한번 살펴볼까요?



1. from PIL import Image → Pillow 모듈은 import Pillow 로 하지 않습니다. import PIL 입니다.





2. im = Image.open('1.jpeg') → 1.jpeg 이라는 파일명의 이미지 파일을 엽니다. 


단순히 Image,open(파일명) 이 아니라 그 행위를 im 이라는 변수에 집어넣었습니다. 


모든 이미지 처리는 이미지를 연 후에 행동해야 하기 때문에, 앞으로 이미지 처리 함수들은 모두 im 변수를 통해 접근하게 됩니다. 


(여기서 '열다'의 의미는 '작업대상이다'를 의미합니다.)





3. im2 = im.resize((128,128)) → 리사이즈 해주는 함수입니다. 


2000 x 2000 사이즈의 파일이라도 resize((128,128)) 을 한다면 128 x 128 로 작아집니다.


im.resize((128,128)) 의 의미는 1번에서 나온 1.jpeg 파일을 연 후(작업대상으로 지정한 후), 그 파일을 resize 합니다. 


그리고 resize 한 새로운 파일을 im2 라는 변수에 집어넣었습니다. 


im 의 이미지는 1.jpeg(예를 들어 2000 x 2000) 이고, im2 의 이미지는 128 x 128 크기의 이미지가 되는 것 입니다.





4. im2.save('test2.jpeg') → 파일을 저장하는 함수입니다. 


im2 라는 변수 안에 있는 이미지 (128 x 128 크기의 이미지)를 test2.jpeg 이라는 파일명으로 저장합니다.





5. print(im2.size) → size 함수는 해당 변수의 이미지의 크기를 반환합니다. 


im2 이미지는 128 x 128 이기 때문에 print(im2.size) 함수를 사용할 경우 (128,128) 의 값을 출력해 줍니다.





------------------------------------------------------------------------------------------------------------------------------


이렇게 파이썬 이미지 처리 모듈 Pillow 의 4가지 기본적인 함수에 대해 살펴봤습니다.


>>> 1. Image.open(파일명) → (파일명) 파일을 작업대상으로 지정함.

>>> 2. im2 = im.resize((128,128)) → 작업대상으로 지정한 이미지의 크기를 128 x 128 로 변환 후 im2 변수에 넣음.

>>> 3. im2.save(파일명) → im2 변수 안에 있는 이미지를 (파일명) 이미지파일로 저장함.

>>> 4. print(im2.size) → im2 변수 안에 있는 이미지의 크기를 출력함.(출력은 print 함수가 담당함.)





Posted by NDC :

apt 자주쓰는 명령어

2017. 6. 28. 03:04 from Linux

* apt 자주쓰는 명령어 *

 

리눅스 커맨더창에서 apt 명령어는 종종 쓰입니다.

 

패키지 설치/제거/보기/버전업그레이드 등등

 

리눅스 유저라면 apt 명령어를 꼭 알아야 한다고 생각합니다.

 

오늘은 자주쓰는 apt 명령어 5개를 알아보겠습니다.

 

---------------------------------------------------------------------------------------------------------------------------------------------------------

 

1) 패키지 설치

 

>>> apt-get install (pakage name)

 

 

 

2) 패키지 제거

 

>>> apt-get remove (pakage name)

 

하지만 위의 명령어보다 저는 설정 값, 설정 파일까지 싹 다 없애주는 --purge 옵션을 같이 씁니다.

 

>>> apt-get --purge remove (pakage name)

 

 

 

3) 패키지 검색

 

>>> apt-cache search (pakage name)

 

 

 

4) 패키지 정보 보기

 

>>> apt-cache show (pakage name)

 

 

 

5) 소스리스트 업데이트

 

>>> apt-get update

 

인수가 없는걸로 알고 있고, 예)Kali ver 1.0 -> 2.0 으로 업그레이드 시킬때와 같이 버전업을 위해서 쓴다고 알고 있습니다. 

 

 

 

6) 설치된 패키지 업데이트

 

>>> apt-get upgrade

 

설치되어있는 모든 패키지들을 한 번에 업그레이드 시켜줍니다.

 

---------------------------------------------------------------------------------------------------------------------------------------------------------

 

더 많은 정보는 --help 명령어가 있습니다!

 

저는 언제나 주로 쓰는 것들만, 야매로 알려드립니다.

 

사실 모든 것들을 머릿속에 넣고 다닐 순 없습니다. 그때그떄 필요한 기능을 얼마나 잘 찾아서 쓰느냐가 중요한 것이라고 생각합니다.

 

그러므로 --help 명령어를 애용합시다.

 

apt 명령어는 리눅스유저에게 꼭 필요한 명령어라고 생각합니다.

 

>>> apt-get

 

>>> apt-cache

Posted by NDC :

* Kali Linux 에서 한글 패치하기 *

 

칼리 리눅스를 처음 설치하시면, 한글이 안나오실 겁니다. (출력/입력 둘다 안될겁니다.)

 

이번에는 우리나라의 한글을 칼리 리눅스에서 해보겠습니다.

 

별로 어렵지는 않습니다. 명령어 몇 개만 치면 됩니다.

 

일단 어떤 방식인지만 간략하게 봅시다.

 

------------------------------------------------------------------------------------------------------

 

>>> apt-get install -y fonts-nanum

 

>>> fc-cache -f -v

 

>>> settings -> Region & Language 에서 설정하기 -> 재부팅

 

여기까지는 한글을 출력하기 위함입니다.

 

이 아래는 한글을 입력하기 위한 것입니다.

 

>>> apt-get install -y nabi

 

>>> apt-get install -y im-config

 

>>> im-config 실행 -> '확인' -> 'Yes' -> hangul 선택 -> '확인' -> 로그아웃 후 로그인

 

------------------------------------------------------------------------------------------------------

 

위 방법처럼만 따라하시면 한글 입력/출력이 다 됩니다.

 

한/영키는 컴퓨터의 한/영키가 아닌

 

Shift + SpaceBar

 

입니다.

 

Posted by NDC :

* Linux 에서 Terminal 단축키 설정하기 *

 

 

Linux 에서 Terminal 이란 매우 중요한 존재이죠.

 

제 생각으로는 리눅스의 처음이자 마지막이자 리눅스의 모든 것이라고 생각합니다.

 

이런 Terminal 을 자주쓰기 위해서는 사이드바에서 클릭하는 것 보다는 단축키가 더 편하겠죠?

 

가끔씩 Linux 에서는 이 Terminal 이 단축키지정이 안되어있는 경우가 있습니다.

 

그 Terminal 단축키 지정하는 법을 한번 알아봅시다.

 

--------------------------------------------------------------------------

 

OS : Kali Linux

VM : Virtual Box

 

제 칼리리눅스는 처음 설치 당시에는 터미널에 단축키가 지정되어있지 않았습니다.

 

그러나 제 다른 노트북(우분투, 루분투) 에는 단축키가 지정되어있죠.

 

흔히 쓰는 터미널 단축키는

 

" Ctrl + Alt + T "

 

입니다.

 

 

1. 우선 리눅스를 들어갑니다.

 

 

왼쪽 사이드바 위에서 2번째에 터미널이 보이네요.

 

저희는 저 터미널에 단축키를 지정해야 합니다.

 

그러기위해서는 맨 아래에 9개의 점 있는 곳으로 갑시다.

 

 

 

2. Setting 창을 여세요.

 

 

아래에 Show Applications 를 클릭합니다.

 

클릭하면

 

 

여러 종류의 Applications 가 나옵니다.

 

그 중에서 Settings 로 들어갑시다.

 

Settings 로 들어가면 아래와 같은 창이 나옵니다.

 

 

All Settings 라는 카테고리입니다.

 

보시면 가운데 Hardware 카테고리에 KeyBoard 가 있습니다.

 

KeyBoard 에 들어갑시다.

 

 

들어가시면 위와 같은 창이 나옵니다.

 

 

 

3. Terminal 의 단축키를 설정합시다.

 

 

KeyBoard 에 들어가셔서 맨 아래로 스크롤을 내리면 위와 같은 화면이 나옵니다.

 

맨 아래에 " + " 라고 추가할 수 있는 항목이 만들어져 있습니다.

 

+ 를 누릅시다.

 

 

누르면 위처럼

 

Add Custom Shortcut

 

창이 나옵니다.

 

Name 란에 terminal

 

Command 란에 gnome-terminal 을 쳐 줍시다.

 

그리고 마지막으로 단축키를 지정해 주기 위해서 Edit 를 클릭합시다.

 

 

Edit 버튼을 클릭하시면 아무 반응도 없습니다.

 

그냥 키보드 Ctrl 과 Alt 와 T 를 같이 누르면 저렇게 Shortcut 란에 설정이 됩니다.

 

그리고 오른쪽 상단 위의 Add 버튼을 눌러줍시다.

 

 

설정이 됬습니다!

 

하지만 이게 버그때문인지 절대 한번에 설정해서 한번에 돌아가질 않습니다.

 

저희는 위와 같은 일을 반복해야 합니다. (저만 그런 것일 수도 있습니다.)

 

다 할 필요는 없고 단축키만 다시 설정해주시면 됩니다.

 

Show Applications -> Settings -> KeyBoard -> 맨 아래에 설정되어있는 terminal 항목 클릭 -> Edit 한번 클릭 후 Ctrl 과 Alt 와 T 입력 -> Ctrl+Alt+T 입력됬는지 확인.

 

단축키를 다시 설정하셨으면 설정 창은 끄고 백그라운드로 돌아옵시다.

 

테스트를 해 볼까요?

 

 

Ctrl 과 Alt 와 T 를 눌렀더니 터미널이 열렸습니다!

 

잘 작동 되시면 제대로 설정하신 겁니다.

 

물론 Ctrl + Alt + T 가 아니여도 됩니다. 사용자의 입맛에 맞게 설정해 주시기 바랍니다.

 

-------------------------------------------------------------------------------------------------------

 

터미널을 잘 다루는 유저가 진정한 리눅스 유저라고 생각합니다.

 

Ctrl + Alt + T

 

Posted by NDC :