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해주면 잘 된다.

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로 컴파일


'Documents' 카테고리의 다른 글

pip install시 UnicodeDecodeError 발생할 때  (0) 2015.11.26
Core Dump 파일 생성  (0) 2015.11.03
hexdump 함수  (0) 2015.09.02
Using Multiple(Virtual) Desktop in Windows 10 VMware  (0) 2015.08.22
Windows 10에서 MS Office 에러  (0) 2015.08.19

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