'분류 전체보기'에 해당되는 글 695건

9월

2016. 9. 22. 11:01

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.


Visual Studio 2008 환경에서 libcurl을 사용할 일이 생겼다.

그냥저냥 인터넷에 나와 있는 대로 하니 파일 다운로드 받는 위치도 사람마다 다르고, 버전도 달라서 고생을 많이 했다.

다음부터는 이런 고생을 하지 않기 위해, 또는 나와 같은 처지인 사람들을 위해 이렇게 글을 남겨 둔다.


일단 libcurl의 최신 버전은 Visual Studio 2008에서 사용할 수 없다.

따라서 이전 버전을 사용하는 수밖에 없는데, 나는 7.23.1버전을 사용했다.

Debug로 빌드할지 Release로 빌드할지는 사용자 마음대로이므로 이부분은 Debug로 고정해서 서술하겠다.


적용 방법은 다음과 같다.



1. 자신의 VS에 맞는 libcurl을 다운받는다.


https://curl.haxx.se/download/


필자는 7.23.1을 다운받았다.

모든 버전의 libcurl은 여기서 다운받을 수 있다.





2. 다운로드받은 libcurl을 Visual Studio 2008로 빌드한다.


libcurl의 압축을 풀면 내부에 dsw 파일이 존재한다. 이를 VS 2008로 열면 프로젝트가 열린다.

curlsrc와 libcurl의 두 가지인데, 이중 libcurl만 빌드해도 상관없다.

별 이상 없이 빌드가 완료되면 lib\DLL-Debug\ 내부에 libcurld.dll과 libcurld_imp.lib 파일이 생성된다.





3. libcurl을 사용할 프로젝트를 생성하고, 라이브러리를 설정한다.


Project -> Properties -> Configuration Properties -> C/C++ -> Additional Include Directories 에 libcurl 내부의 include 디렉토리를 지정한다.


Project -> Properties -> Configuration Properties -> Linker -> Additional Library Directories 에 libcurl/lib 내부의 DLL-Debug 디렉토리를 지정한다.


Project -> Properties -> Configuration Properties -> Linker -> Input -> Additional Dependencies 에 libcurld_imp.lib를 지정한다.


마지막으로 libcurl/lib/DLL-Debug 내부에 들어 있는 libcurld.dll 파일을 복사하여 <프로젝트 디렉토리>/Debug/ 에 넣는다.


이제 libcurl 사용이 가능해졌을 것이다.







https://curl.haxx.se/libcurl/c/simple.html


이 안에 있는 예제를 빌드해 보자.

다음과 같이 잘 실행된다면 성공이다.



'Knowledge' 카테고리의 다른 글

[Assembly] Intel x86, Local JMP [0xE9]  (0) 2016.11.07
[BigData] Spark 공부  (0) 2016.10.19
RC4 Stream Cipher  (0) 2016.07.19
스트림 암호 (Stream Cipher)  (0) 2016.07.18
사설망-외부망 통신에 대한 공부  (0) 2016.07.02
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,

8월

2016. 8. 25. 13:38

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

수습기간 :D

잡담 2016. 7. 29. 10:47


곧 3개월간 수습기간이 시작됩니다.


일단 합격은 했지만, 여기서의 성과에 따라 또 입사취소가 될 수 있다는게 너무 무섭네요 ;ㅅ;

회사 업무에 온 힘을 쏟아야겠습니다!

수습기간에 뭘 할지 궁금하기도 하네요 ㅎㅎㅎㅎ

'잡담' 카테고리의 다른 글

Tistory Flatinum 스킨 수정해서 사용  (0) 2016.10.18
수습 조기종료  (0) 2016.10.04
이스트소프트 최종합격 :D  (11) 2016.07.22
Todo List  (0) 2016.07.18
이스트소프트 면접 후기  (4) 2016.07.06
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,



GoLang을 공부하다가 문득 생각한 것이 있다.

package main

import "fmt"

type Temp struct {
	A int
	B int
}

func main () {
	tmp1 := Temp{10, 20}
	tmp2 := &Temp{10, 20}
	fmt.Println(tmp1.A, tmp1.B)
	fmt.Println(tmp2.A, tmp2.B)
}

이런 코드가 있다고 했을 때, tmp1과 tmp2는 대체 어떤 차이가 있는 것일까?

배울 때 본 것을 그대로 적용하면 tmp1에는 변수 자체가 들어간 것이고,

tmp2에는 변수의 포인터가 들어가 있기 때문에,

두 번째 Println은 자동으로 (*tmp2).A, (*tmp2).B 형식으로 참조한다고 한다.


그런데 그게 어떻게 다르다고 하는 것일까?

실제로 값을 변경해 봐도 똑같이 변경되고, 출력해도 똑같이 출력된다.


http://stackoverflow.com/questions/33593545/golang-difference-between-struct-vs-struct

인터넷을 찾아보니, 여기서 설명하기를 메서드를 이용해 구조체 멤버변수를 바꿀 때 차이가 난다고 한다.


우선 알고 가야 할 것이, GoLang에서는 구조체 내부에 포함되는 메서드라는 개념이 없다.

대신 기본 타입이 아니라면 어디에든 메서드를 갖다 붙일 수 있다.

이를 이용하여 C++이나 Java의 의 클래스 멤버 함수처럼 구현이 가능하다.


이의 구현은 아래 코드로 예시를 들 수 있다.

package main

import "fmt"

type Temp struct {
	A int
	B int
}

func (tmp *Temp) PrintVar() {
	fmt.Println(tmp.A, tmp.B)
}

func main () {
	tmp1 := Temp{10, 20}
	tmp2 := &Temp{10, 20}
	tmp1.PrintVar()
	tmp2.PrintVar()
}

결과는 둘 모두 똑같이 10과 20을 출력한다.


여기까지만 봐서는 뭐가 다른지 감이 잡히지 않을 것이다.

다른 점은 메서드 내에서 두 구조체의 변수를 변경할 때 생긴다고 한다.

흔히 말하는 Setter의 개념이다.

위 링크의 답변에 있는 소스를 그대로 가져와 보자.

package main
import "fmt"



type test_struct struct {
  Message string
}

func (t test_struct)Say (){
   fmt.Println(t.Message)
}

func (t test_struct)Update(m string){
  t.Message = m; 
}

func (t * test_struct) SayP(){
   fmt.Println(t.Message)
}

func (t* test_struct) UpdateP(m string)  {
  t.Message = m;
}

func main(){
  ts := test_struct{}
  ts.Message = "test";
  ts.Say()
  ts.Update("test2")
  ts.Say() // will still output test

  tsp := &test_struct{}
  tsp.Message = "test"
  tsp.SayP();
  tsp.UpdateP("test2")
  tsp.SayP() // will output test2

}

이를 실행하면 ts에서는 두번 다 "test"가 출력되고,

tsp에서는 두 번째 Print에서 값이 변경되어 "test2"가 출력된다.

위 링크의 답변에서는 이런 방식으로 struct{}와 &struct{} 선언의 차이가 생긴다고 한다.


의문은 여기서 생긴다.

잘 보면 ts와 tsp가 실행하는 메서드가 다르다.

ts가 실행하는 메서드는 (t test_struct) Update 이고,  tsp가 실행하는 메서드는 (t *test_struct) UpdateP 이다.

메서드의 선언부분에 차이가 있고, 애초부터 메서드명부터 다르므로 일단 다른 함수인 것이다.

혹시 저 메서드명을 같게 만들어서 struct{}와 &struct{} 각각의 선언에 따라 다른 메서드가 실행되는지 실험해보기 위해 메서드명을 같게 하고 컴파일을 시도해보기도 하였으나, 같은 메서드명이 있다며 컴파일되지 않았다.


요약하면 저 글의 답변은 struct{}와 &struct{}의 차이점이 아닌, 포인터 리시버를 갖는 메서드와 그렇지 않은 메서드의 차이를 설명하고 있는 것이다.

실제로 ts와 tsp 모두 UpdateP 메서드를 실행시키도록 하면 둘 모두 "test2"로 바뀐 결과를 확인할 수 있으며, 

둘 모두 Update 메서드를 실행시키도록 하면 둘 모두 "test"만을 출력하는 결과를 확인할 수 있다.


포인터 리시브를 하는 이유는 간단하다.

이것이 아주 좋은 예라고 생각하는데, C++에서 인자로 클래스 포인터를 넘기는 경우를 생각해 보자.

만약 클래스 포인터가 아니라 그냥 클래스 인스턴스로 인자를 넘길 경우, 해당 인스턴스가 그대로 복사되어 들어가기 때문에

함수가 실행되면서 인자가 전달될 때 오버헤드가 생기고, 내부에서 해당 클래스 멤버 변수를 변경해도 '복사된 클래스'이기 때문에

원본 클래스 멤버 변수의 값은 바뀌지 않는다.

하지만 클래스 포인터 타입으로 인자를 넘겨서 참조하여 값을 변경할 경우, 내부 멤버변수의 값을 바꾸는 것이 가능하다.


오버헤드를 줄이고, 클래스 멤버변수의 변경을 가능하게 하기 위함이라는 두 가지 이유 때문에

GoLang에서 포인터 리시브를 하여 메서드를 struct에 '갖다 붙이는' 것이다.



결론은, 구글링을 해봐도 struct{} 선언과 &struct{} 선언의 차이는 알 수가 없었다.


struct{}는 그냥 변수로 받고, &struct{}는 포인터로 받지만

&struct{}로 선언된 객체를 참조할 때는 자동으로 (*struct).var 형식으로 참조하기 때문에 동작에 다를 게 없다.

멤버변수 변조도 메서드단에서 포인터 리시버를 이용하면 struct{}든 &struct{}든 둘 다 변조가 가능하고,

포인터 리시버를 이용하지 않으면 둘 다 변조가 되지 않는다는 점에서도 똑같다.

대체 무슨 차이인 걸까...


interface를 공부하는 도중에 왜 struct{}와 &struct{}를 달리 사용하는지를 일단 알게 되었다.

우선 Minescroll 서버팀 팀원이자 후배가 직접 리버싱하여 살펴본 결과, &struct{}는 struct의 포인터를 받아오기 때문에 참조 횟수가 늘어나 struct{}에 비해 약간 더 느리다.

여기서 간과해서는 안 되는 부분이, struct{}로 받은 타입은 당연하지만 struct이고, &struct{}로 받은 타입은 *struct라는 것이다.


직접 실험해 본 결과, interface를 사용하지 않고 Pointer Receiver를 사용한 메서드를 struct에 갖다 붙였을 때,

struct{}를 사용하던 &struct{}를 사용하던 결과는 같다.

그런데 interface에서는 얘기가 조금 달라진다.

interface에서 선언만 해 둔 메서드를 이후에 (다른 OOP 언어의 말을 빌려) 오버라이딩할 경우가 있다.

이 때 메서드에 포인터 리시버를 사용하게 될 경우, 해당 함수를 실행하는 객체는 꼭 *struct 타입이어야 한다.

*struct 타입이어야 한다는 것은 struct{}로 선언한 이후, 객체 앞에 &를 붙여서 넘겨 주어도 성립한다는 것이다.

만약 멤버변수가 변하지 않아도 괜찮다면, 메서드를 정의할 때 포인터 리시버를 사용하지 않고 그냥 struct형으로 선언하여 실행하면 된다.

그럼 아래와 같은 에러는 발생하지 않을  것이다.


.\main.go:37: cannot use struc (type structType) as type MyInterface in argument to DisplayInfo:

structType does not implement MyInterface (DisplayA method has pointer receiver)

'Programming' 카테고리의 다른 글

[DLL Injection] DLL Injector  (0) 2016.10.05
[C/C++] 공용체 (union)  (0) 2016.09.22
[C++] Reference In Low-level  (0) 2016.07.02
[MITM] Create Repository 'WLAN-Crack'  (0) 2016.06.17
[MITM] TCP Packet Capture & Display  (0) 2016.06.03
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,



최종면접 본 이후, 내가 뭔가 잘못한게 엄청 많은 것 같고,

떨어질까봐 불안해서 안절부절 못하느라 최종면접 후기도 못 쓰고 있었는데,

오늘 합격 통보를 받았습니다.


(사실 전화가 왔었는데 모르는 번호라 안받았다가 직접 연락해서 알았지만)



아마 악성코드분석쪽 업무를 맡게 될 것 같네요.

너무 기분이 좋습니다. 지금까지 응원해주신분들 정말 감사드립니다!


간다, 야근요정!

저장된 카페인은 충분한가!!

'잡담' 카테고리의 다른 글

수습 조기종료  (0) 2016.10.04
수습기간 :D  (0) 2016.07.29
Todo List  (0) 2016.07.18
이스트소프트 면접 후기  (4) 2016.07.06
소스가 왜 돌아가는지 신기하다  (0) 2016.06.30
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,

RC4 Stream Cipher

Knowledge 2016. 7. 19. 10:22



RC4는 Rivest Cipher 4의 약자로, 꽤 오래된 스트림 암호이다.

WEP의 암호화 방식으로 사용되었으나, 현재는 취약점이 드러나 WEP는 사용되지 않고 있다.

이 암호의 작동방식을 아주 간략하게 설명하면,


1. Seed를 통해 랜덤 값 생성

2. 랜덤 값과 원본 텍스트를 XOR


이 끝이다.

복호화는 저 과정을 한번 더 반복하면 된다.

별로 어려운 암호도 아니지만, 이런 걸 구현해보는 것은 또 처음이다 보니 인덱싱 문제로 살짝 고생했다.

작성해본 파이썬 코드는 다음과 같다.


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
def KSA(seed):
    S = []
    key = []
    j = 0
    for i in range(0256):
        S.append(i)
        key.append(ord(seed[i % len(seed)]))
 
    for i in range(0256):
        j = (j + S[i] + key[i]) % 256
        S[i], S[j] = S[j], S[i]
    return key, S
 
def PRGA(key, S):
    i, j = 00
    xorKey = []
    for k in range(0256):
        i = (i+1) % 256
        j = (j + S[i]) % 256
        S[i], S[j] = S[j], S[i]
        xorKey.append(S[(S[i] + S[j]) % 256])
    return xorKey
 
def XOR(xorKey, target):
    ret = []
    for i in range(len(target)):
        ret.append(xorKey[i] ^ ord(target[i]))
    ret = ''.join(map(chr, ret))
    return ret
 
def RC4(text, seed):
    key, S = KSA(seed)
    xorKey = PRGA(key, S)
    return XOR(xorKey, text)
 
seed = "\x01\x02\x03\x04\x05"
text = "Hello World"
 
print "[*] Original Text : " + text
enc = RC4(text, seed)
print "[*] Encoded Text (Hex) : " + enc.encode('hex')
dec = RC4(enc, seed)
print "[*] Decoded Text (Hex) : " + dec.encode('hex')
print "[*] Decoded Text : " + dec
cs


'Knowledge' 카테고리의 다른 글

[BigData] Spark 공부  (0) 2016.10.19
Visual Studio 2008에서 libcurl 사용하기  (0) 2016.09.05
스트림 암호 (Stream Cipher)  (0) 2016.07.18
사설망-외부망 통신에 대한 공부  (0) 2016.07.02
Greedy Algorithm + 회의실 배정  (0) 2016.06.21
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,



대칭키 알고리즘의 일종으로, 대칭키를 이용해 의사 난수열을 발생시키고,

이 난수열을 평문에 XOR하는 방식으로 동작하는 암호화 알고리즘.

마찬가지로 복호화 시에는 대칭키로 의사 난수열을 발생시켜 암호문에 XOR하여 평문을 얻어낸다.


(출처 : http://www.ktword.co.kr/abbr_view.php?nav=2&id=955&m_temp1=5541)

'Knowledge' 카테고리의 다른 글

Visual Studio 2008에서 libcurl 사용하기  (0) 2016.09.05
RC4 Stream Cipher  (0) 2016.07.19
사설망-외부망 통신에 대한 공부  (0) 2016.07.02
Greedy Algorithm + 회의실 배정  (0) 2016.06.21
Kernel/User mode  (0) 2016.04.15
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,

Todo List

2016. 7. 18. 10:31

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.


면접 보기 전에 선배와 만나서 밥 먹고, 1층의 카페테리아에서 커피 한잔 마시고 들어갔다.

(주 출입구는 2층에 있고, 한 층 내려가면 1층이다.

이런 비탈길 구조는 디미고 기숙사에도 똑같이 적용되어있어서 처음엔 헷갈렸는데 지금은 금방 적응했다.)


양치질도 하고 만반의 준비를 했는데도 엄청 긴장하고 들어갔다.

1대 다 면접이라고만 씌여있어서 엄청 압박면접일 것 같았고, 그래서 머릿속이 새하얘졌다.


직접적으로 면접때 어떤 질문이 나왔는지는 적지 않겠다.

기술면접이었으므로 기술면접에 어울리는 문제들이 나왔을 것이라고 보면 된다.

실제로 대부분의 질문은 자료구조, 알고리즘, 기타 IT 지식 및 자기소개서, 포트폴리오에 적은 것에서 나왔다.


분위기는 엄청 좋았던 것 같다.

면접관님들이 두분 다 긴장하지 말고 천천히 해도 된다며 격려해주시고 배려해주셔서 확실히 많이 긴장을 풀고 그나마 편하게 대답할 수 있었다.

두분 다 말씀하시는거라던지, 성격이라고 해야 할지(이 한 시간동안 얼마나 많이 봤겠냐마는) 너무 맘에 들어서

정말 좋은 사람이라고, 여기에 입사하면 이런 사람들과 일할 수 있구나 라는 생각까지 들었다.

면접이 끝나고 마지막까지 웃으면서 배웅해주시기까지 했는데, 그렇게 고마운 마음이 들 수가 없었다.

이스트소프트가 왜 신입 개발자들에게 좋은 평가를 받는 지 알것 같은 기분이 든다.


질문에 답할 수 있는 것은 최대한 자신 있게 답하려고 노력했는데,

질문에 답을 하며 아직도 자신이 기초지식이 정말 부족하다는 것을 뼈져리게 느꼈다.

그렇게 어려운 것들을 물어보신것도 아닌데 당황해서 말도 빨라지고, 발음도 안 좋고, 엉성하게 대답하고...


나름 천천히 말하고 발음도 정확하게 하려고 다짐하고 들어갔는데 긴장하니 나도 모르게 빨라져버리더라...

대답 못한 질문도 꽤 있고, 나 외에도 세 명 더 면접을 봤을 테니(내가 넷 중 가장 첫번째였다)

뒤의 결과가 어떻게 될지는 잘 모르겠다.


결과가 어찌되건 내년이든 내후년이든 기회가 된다면 몇 번이든 이 회사에 다시 지원하겠지 싶다.

그만큼 맘에 든 회사고, 특히 면접관분들이 너무 인상깊어서도 그렇다.


역시 좋은 결과를 기대하며 기다려보도록 하자 :)

'잡담' 카테고리의 다른 글

이스트소프트 최종합격 :D  (11) 2016.07.22
Todo List  (0) 2016.07.18
소스가 왜 돌아가는지 신기하다  (0) 2016.06.30
ESTSOFT 코딩테스트 합격  (1) 2016.06.29
ESTSOFT 코딩테스트 후기  (19) 2016.06.27
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,