list, tuple

[1,locals().__setitem__("abs",lambda x:eval("ans+1"))][0]

dictionary

{1:(2,locals().__setitem__("abs",lambda x:eval("ans+1")))[0]}

시험지를 제작할 때 한글에서 누름틀을 이용하면 교사용에는 답안이 출력되도록, 학생용에는 답안이 출력되지 않도록 설정이 가능하다.

부득이하게 word에서 작업해야 할 때 word에서도 한글의 누름틀과 유사한 기능이 있는지 찾아보는데, 정확히 일치하는 기능은 없지만 출력시에 출력이 되게 혹은 안 되게 할 수 있는 Hidden Text라는 기능이 있다.

Hidden Text로 지정할 부분을 드래그한 뒤 Ctrl + Shift + H를 누르면 밑줄이 생기며 Hidden Text 속성이 된다.

편집시 Hidden Text를 보거나 보이지 않게 하려면 홈에서 아래 버튼을 누르면 된다.

Hidden Text를 인쇄하도록 설정을 바꾸려면 파일-옵션-표시에 들어가 인쇄 옵션에서 숨겨진 텍스트 인쇄를 체크해주면 된다.

Hidden Text 기능에서 엔터가 이상해질 때가 있다. 예를 들어,

(1) 1+1=2이다.

True.

(2) 1+2=4이다.

False. 1+2=3.

에서 True와 False를 Hidden Text로 만들어버리면 엔터가 사라지고 다음과 같이 표시된다.

(1) 1+1=2이다.

(2) 1+2=4이다.

이럴 때 엔터를 유지하고 싶다면 True의 맨 끝에 커서를 둔 뒤 Ctrl + Shift + H를 한번 더 누르면 된다. 그러면 다음과 같이 출력된다.

(1) 1+1=2이다.


(2) 1+2=4이다.


칼리리눅스 2.0에서 IPTIME의 N150UA USB무선랜카드 사용하는 방법을 소개하겠다.

아래 삭제된 내용과 같이 글을 썼었는데, 왜인지 모르겠으나 rt28xx_get_wireless_stats() 함수에서 커널 패닉이 종종 일어나는 것을 확인하였다.

조금 더 뒤적뒤적해본 결과 리눅스 커널 4.2부터 MT7601U가 지원된다는 것을 확인할 수 있었다. 하지만 칼리리눅스 2.0의 기본 커널 버전은 4.0이었다. 따라서 커널컴파일을 해서 커널 업그레이드를 시도해보았다.

현재 kernel.org에서 stable한 버전은 4.4.2버전이므로 이 버전으로 업그레이드를 진행하였다. http://docs.kali.org/development/recompiling-the-kali-linux-kernel를 참고하였다.

커널 컴파일을 본격적으로 진행하기 전에 실패할 경우를 대비해 SNAPSHOT을 꼭 찍어두길 바란다.

apt-get install kernel-package ncurses-dev fakeroot

로 필요한 것들을 받아준다. 그리고 kernel.org에서 linux-4.4.2.tar.xz 등 최신 stable 버전을 받아준다.

tar -xvf linux-4.4.2.tar.xz
cd linux-4.4.2

로 압축을 푼 뒤 폴더로 이동한다.

cp /boot/config-4.0.0-kali1-amd64 .config

로 기본 설정을 복사해준 뒤

make menuconfig

를 이용해 세부 설정을 해준다. 이 때, MT7601U는 기본으로 설치되지 않아 설정이 필요하다.

Device drivers - Network device support - Wireless LAN - Mediatek Wireless LAN support

로 들어가 이를 체크해주고, 이 하위로 들어가 Mediatek MT7601U (USB) support도 체크해준다. 하위 옵션으로 이동시에는 엔터를, 체크에는 스페이스바를 이용하면 된다. 체크를 해준 뒤 save를 해서 콘솔로 빠져나온다.


export CONCURRENCY_LEVEL=$(cat /proc/cpuinfo | grep processor | wc -l)

를 통해 멀티코어를 이용해 컴파일을 할 수 있다.

make-kpkg clean

로 이전 패키지가 존재한다면 삭제하고,

fakeroot make-kpkg kernel_image

를 이용해 컴파일한다. 이 때 컴파일 시간이 환경에 따라 몇 시간까지 걸릴 수 있으니 자고 오거나 하면 된다.

컴파일이 완료되면 다음과 같이 입력해주면 된다.

dpkg -i ../linux-image-4.4.2_4.4.2-10.00.Custom_amd64.deb
update-initramfs -c -k 4.4.2
update-grub2
reboot

버전이나 deb 파일명은 알아서 조절하면 된다. 재부팅 이후에 바로 될줄 알았는데 firmware를 설치해주어야 한다.

wget -O /lib/firmware/mt7601u.bin https://git.kernel.org/cgit/linux/kernel/git/firmware/linux-firmware.git/plain/mt7601u.bin

deprecated: https://github.com/porjo/mt7601/raw/master/src/mcu/bin/MT7601.bin)

그리고 다시 재부팅하면 잘 되는 것을 확인할 수 있다.


혹시 커널컴파일이 귀찮은 분들을 위해 deb파일을 올려두겠다. 다시 한번 말하지만 실패할 경우를 대비해 꼭 SNAPSHOT을 찍어두길 바란다.

linux-image-4.4.2_4.4.2-10.00.Custom_amd64.7z.001

linux-image-4.4.2_4.4.2-10.00.Custom_amd64.7z.002

linux-image-4.4.2_4.4.2-10.00.Custom_amd64.7z.003

linux-image-4.4.2_4.4.2-10.00.Custom_amd64.7z.004


=== 16.02.24 업데이트로 삭제된 내용 (사유: 잦은 커널 패닉) ===

칼리리눅스에 N150UA를 연결한 뒤 lsusb를 입력하면 MT7601U를 볼 수 있다.

하지만 iwconfig를 쳐보면 인식이 되지 않는다. 드라이버를 설치해야 한다.

N150UA Linux용 드라이버는 http://www.mediatek.com/en/downloads1/downloads/?sort=os 에서 MT7601U USB를 선택해 다운받을 수 있다.

먼저 

apt-get install linux-headers-$(uname -r) build-essential

로 필요한 헤더와 프로그램 등을 다운받는다.

압축을 푼 뒤 이를 컴파일해서 install해야하는데, 오래된 소스이다보니 make를 그냥 하면 몇 군데 에러가 뜬다.

총 두 군데를 고쳐야한다.

1. sta/sta_cfg.c

__DATE__와 __TIME__ 매크로에서 에러가 난다. 따라서 5766번째 줄을 다음과 같이 수정한다.


2. os/linux/rt_linux.c

type casting이 지원이 되지 않아 에러가 난다. 강제 casting을 해준다.


그런 다음 make와 make install을 차례대로 실행 후 reboot한 뒤 modprobe mt7601Usta해주면 잘 된다.

  1. 당근 2016.06.23 11:20

    명확하고 깔끔한 설명 잘 봤습니다! VMware 안에서도 똑같이 적용되나요?

  2. 덕분에^^ 2016.07.27 23:25

    많은 도움이 되었습니다.
    커널 4.6.4로 컴파일 후 재부팅하니 안잡혀서 설명한 펌웨어 받으려니 안받아지더군요
    뒤적이다 아래 경로를 찾아 펌웨어 받은 후 재부팅하니 잡히네요 ㅎㅎ
    http://git.kernel.org/cgit/linux/kernel/git/firmware/linux-firmware.git/plain/mt7601u.bin
    감사합니다^^

  3. 실험자 2017.04.20 16:22

    안녕하세요!
    정말 친절하게 작성하셔서 잘 따라했는데
    펌웨어까지 업데이트하고 재부팅하였는데
    wireless 가 설정에 안뜨네요 ㅠㅠ

    무엇인 문제인지 알 수 있을까요?
    lsusb 하면 mediatek은 연결되어있는 것을 확인할 수 있습니다..

    • 유메 yum3 2017.05.22 17:14 신고

      글쎄요.. 드라이버가 제대로 실행중인지 확인해야할 듯 합니다.

  4. ㅇㅇ 2017.04.23 18:00

    우클릭 방지 개극혐 진짜.

    • 유메 yum3 2017.05.22 17:15 신고

      불펌이 하도 많다보니 어쩔 수 없습니다. 글마다 부분적으로 우클릭 방지를 걸 수 있는 것도 아니고요. 그리고 이 글 보고 따라할 컴퓨터 지식이 있다면 우클릭 방지 정도는 쉽게 푸실텐데요.

  5. cdnews 2020.11.17 17:18

    도움되는 내용 잘 보고 가용~

pip는 python 2.7.9 이후에는 내장되어있다. Windows에서 pip로 모듈을 설치하다보면 

File "C:\Python27\lib\ntpath.py", line 85, in join

  result_path = result_path + p_path

UnicodeDecodeError: 'ascii' codec can't decode byte 0xbd in position 0: ordinal not in range(128)

과 같은 에러가 뜰 때가 있다. (byte 0xbd와 position 0은 달라질 수 있음)

이 때 확인해봐야 할 것은 경로명에 한글이 있는지(예: C:\Users\홍길동), 그리고 hostname(PC명)에 한글이 있는지 확인해보아야 한다.

hostname은 내컴퓨터의 시스템속성(프로세서, RAM같은거 써있고 컴퓨터 성능 별점매길수 있는 페이지)에서 확인할 수 있다.

hostname에 한글이 있다면(정확히는 ascii가 아닌 글자가 있다면) 이를 영어로 바꿔주자.

단, hostname을 바꾸면 인터넷뱅킹같은거 할 때 귀찮아질 수도 있다.. (새로은 PC로 인식해 다시 등록하라고 할 수 있음. 사실 안 해봐서 확답은 못 드림)

1. core dump 파일사이즈 limit 변경

$ ulimit -c unlimited

이러면 core dump 파일사이즈의 제한이 없어진다. 하지만 이는 매번 로그인할 때마다 바뀌므로 영구적인 변경을 위해서는 /etc/security/limits.conf에 다음 line 추가한다.

*               soft    core            unlimited

*               hard    core            unlimited

(제일 왼쪽에는 계정id가 들어감. 모든 계정에 대해서는 *)


2. core_pattern 등록

echo "/tmp/core.%e.%p.%h.%t" > /proc/sys/kernel/core_pattern

or

sysctl -w kernel.core_pattern=/tmp/core.%e.%p.%h.%t

이런 식으로 어느 위치에 저장할 건 지 + 파일명의 format은 어떻게 할 건지 지정해준다.

포맷은 다음과 같다.

%p: pid

%u: uid

%g: gid

%s: signal number

%t: dump된 시간 (UNIX timestamp)

%h: hostname

%e: 실행파일명


근데 이는 재부팅마다 초기화된다. 구글링해본 결과 /etc/sysctl.d에 10-core-dump.conf를 만든 뒤 다음 line을 추가한다.

kernel.core_pattern=/tmp/core.%e.%p.%h.%t

하지만 Ubuntu 14.04기준 이도 재부팅되면 초기화된다. 영구적으로 만드는 것은 천천히 알아봐야겠다.

1. opcode -> assembly

[1] 파이썬 capstone library 이용하기

http://www.capstone-engine.org/lang_python.html

예) 24Byte shellcode 명령어


from capstone import *

CODE = b"\x31\xd2\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x52\x53\x89\xe1\x8d\x42\x0b\xcd\x80"

md = Cs(CS_ARCH_X86, CS_MODE_32)
for i in md.disasm(CODE, 0x1000):
    print("0x%x:\t%s\t%s" %(i.address, i.mnemonic, i.op_str))

test.py에 저장 후 실행


[2] C파일에 넣어서 컴파일

char s[]="\x31\xd2\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x52\x53\x89\xe1\x8d\x42\x0b\xcd\x80";

int main(int argc, char **argv) {
	return 0;
}

컴파일 후 gdb로 확인



2. assembly -> opcode

[1] nasm 사용하기

BITS 32

xor edx, edx
push edx
push 0x68732f6e
push 0x69622f2f
mov ebx, esp
push edx
push ebx
mov ecx, esp
lea eax, [edx+0xb]
int 0x80

를 sh.S에 저장 후

nasm sh.S

[2] C의 inline assembly

int main() {
	__asm__ __volatile__(
	"xor %edx, %edx\n\t"
	"push %edx\n\t"
	"push $0x68732f6e\n\t"
	"push $0x69622f2f\n\t"
	"mov %esp, %ebx\n\t"
	"push %edx\n\t"
	"push %ebx\n\t"
	"mov %esp, %ecx\n\t"
	"lea 0xb(%edx), %eax\n\t"
	"int $0x80\n\t"
	);
}

test.c에 넣고 gcc로 컴파일


hex editor에서 보는 것처럼 데이터를 hex로 dump해주는 코드이다.


void hexdump(const uint8_t *buf, const uint32_t len) {
	const uint32_t size = 16;

	for (uint32_t i = 0; i < len; i += size) {
		printf("[0x%04x] ", i);
		for (size_t j = i; j < i + size; ++j) {
			if (j == i + size/2) putchar(' ');
			if (j>=len)
				printf("   ");
			else
				printf("%02x ", buf[j]);
		}
		putchar(' ');
		for (uint32_t j = i; j < i + size && j < len; ++j) {
			if (j == i + size / 2) putchar(' ');
			if (buf[j] >= 0x20 && buf[j] < 0x80)
				putchar(buf[j]);
			else
				putchar('.');
		}
		putchar('\n');
	}
	putchar('\n');
}


/usr/include같은 디렉토리에 hexdump.h에 저장해두면 #include<hexdump.h> 후 간편히 사용할 수 있다.

Windows 10의 Multiple Desktop을 사용해서 하나는 Windows로, 나머지 하나는 VMware를 이용해 Ubuntu를 전체화면 해두고 사용하려고 했는데 Ubuntu에서는 단축키인 Ctrl + Windows + Arrow키가 먹히지를 않는 것이다. 윈도우 키를 VMware 안에서 처리해버리기 때문이다.

When using multiple desktop in Windows 10, Windows in one desktop, Ubuntu from VMware in another, I could not use the shortcut key for switching desktops(Ctrl + Windows + Arrow). It's because windows key is handled by VMware, not Windows.

이 단축키를 사용할 수 있는 간단한 방법은 Ctrl + Alt를 이용해 VMware모드를 빠져나간 뒤 Ctrl + Windows + Arrow키를 누르는 방법이다.

Easiest way to solve this problem is to escape VM mode with Ctrl + Alt, and then press Ctrl + Windows + Arrow.

아니면 Windows키를 VMware에서 처리하지 않도록 하는 방법이 있는지는 모르겠다.

I'm not sure if I can make VMware not handle window key.

"ppt 내용에 문제가 있습니다. 프레젠테이션 복구가 시도될 수 있습니다.원본을 신뢰할 경우 복구를 선택하십시요"


Windows 7에서 Windows 10으로 업그레이드 후 pptx 파일을 열면 위와 같은 에러가 발생하였다.

다음 링크에 들어가서 이 문제를 해결할 수 있다.

https://support.microsoft.com/en-us/kb/3086786


해결책 1: 폴더 권한 변경

1. 다음 명령어 복사

2. cmd를 관리자 권한으로 실행(Windows키 누른 후 cmd 검색 후 ctrl + shift + enter)

3. 명령어 붙여넣기 후 엔터


이 해결책으로 말끔히 해결되었다.

주어진 정수 \(a, b, c\)에 대하여 \[ax + by = c\]를 만족하는 정수 \(x, y\)를 찾는게 목적이다.

\(d\)는 \(a, b\)의 최대공약수라고 하자. 이 때, \(d\mid c\)인 경우 무한한 \(x, y\)가 존재하고, \(d\nmid c\)인 경우 해는 존재하지 않는다. (\(a\mid b\)의 의미는, \(a\)는 \(b\)를 나눌 수 있다는 의미이다.)

해가 존재할 경우, 특수해(Particular Solution)는 \(x_0=c/d\times s, y_0=c/d\times t\)로 구한다. 이 때 s와 t는 Extended Euclidean Algorithm으로 구한 값이다.

일반해(General Solution)는 \(x=x_0+k(b/d), y=y_0-k(a/d) \mbox{ where } k\in \mathbb Z\)로 구할 수 있다.


예를 들어 방정식 \(21x +14y =35\)를 풀어보자. 우선 \(d=\mbox{gcd}(21, 14)=7\mid 35\)이므로 무수히 많은 해가 존재한다. 그럼 양변을 7로 나누면 \(3x+2y=5\)로 간소화할 수 있다. 이제 \(s\)와 \(t\)를 구하기 위해 Extended Euclidean Algorithm을 사용하면

\(q\)

\(r_1\)

\(r_2\)

\(r\)

\(s_1\)

\(s_2\)

\(s\)

\(t_1\)

\(t_2\)

\(t\)

1

3

2

1

1

0

1

0

1

-1

2

2

1

0

0

1

-2

1

-1

3

1

0

1

-2

-1

3

따라서 \(s=1, t=-1\)이므로 특수해는 \(x_0=35/7\times 1=5, y_0=35/7\times -1=-5\)이고, 일반해는 \(x=5+2k, y=-5-3k\)가 된다.


디오판틴 방정식의 특수해(\(x_0, y_0\))를 구하는 파이썬 코드를 작성해보자.

def diophantine(a, b, c):
	'''returns (x, y) where ax+by=c'''
	r1, r2 = a, b
	s1, s2 = 1, 0
	t1, t2 = 0, 1
	
	while r2!=0:
		q = r1/r2
		r1, r2 = r2, r1%r2
		s1, s2 = s2, s1-q*s2
		t1, t2 = t2, t1-q*t2
	# gcd: r1
	return (c/r1*s1, c/r1*t1)

diophantine(21, 14, 35)를 하면 (5, -5)가 반환되는 것을 볼 수 있다.

+ Recent posts