기준 ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-77-generic x86_64) gcc 5.4.0 20160609 gcc랑 관련없는 건데 이 운영체제에서 계속 ASLR을 끄고 싶어 echo "kernel.randomize_va_space=0" > /etc/sysctl.d/01-disable-aslr.conf 32비트로 컴파일하고 싶어 -m32 -m32 옵션을 줬는데 이상해 sudo apt install gcc-multilib 32비트로 컴파일하니까 main 함수에 스택을 정렬하는 이상한 인스트럭션이 있어서 짜증나 -mpreferred-stack-boundary=2 최적화 옵션을 주니까 printf@plt가 __printf_chk@plt로 바뀌는 게 싫어 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 CANARY를 없애고 싶어 -fno-stack-protector 스택에 실행 권한을 주고 싶어 -z execstack No RELRO가 기본값인데 Partial RELRO가 필요해 -z relro

Continue reading

우연히 vcpkg를 알게 됐는데 그동안 내가 찾았던 기능이 여기 있었다. vcpkg integrate install를 실행하면 비주얼 스튜디오에서 일일히 프로젝트 설정으로 include할 위치... lib 위치... 이런 걸 지정해주지 않아도 된다. 자동으로 해준다. ㅎㅎ ㅎㅎ 그런데 x86-windows-static 또는 x64-windows-static으로 설치한 라이브러리는 이게 안됐다. x86-windows나 x64-windows로 설치한 라이브러리는 잘만 되는데... 찾아보니 프로젝트 파일을 직접 수정하는 방법이 있었다. 내가 이해한 게 맞다면 새로 생성한 프로젝트마다 같은 작업을 해줘야 한다. 그건 너무 귀찮은 짓 아닌가? 더 찾아보니 이런 방법이 있었다.

Continue reading

fork - exec 조합으로 외부 프로그램을 실행하는 방법은 별로 권장하지 않는다고 한다. 대신 posix_spawn 함수를 추천하는데... 예전에 system 함수 대신 fork - exec를 쓴다고 한 글 system 대신 fork - exec 쓰기에서 사용한 예시를 가져와보면 #include <unistd.h> #include <sys/wait.h> #include <stdlib.h> #include <stdio.h> void _execv(const char *path, char *const argv[]) { int ret; pid_t pid; pid = fork(); if (pid == -1) { perror("fork"); exit(EXIT_FAILURE); } if (pid == 0) { ret = execv(path, argv); if (ret == -1) { perror("execv"); exit(EXIT_FAILURE); } } waitpid(-1, NULL, 0); } int main() { char path[] = "/sbin/iptables"; char *argv_A[] = { "iptables", "-A", "OUTPUT", "-j", "NFQUEUE", "--queue-num", "0", NULL }; char *argv_D[] = { "iptables", "-D", "OUTPUT", "-j", "NFQUEUE", "--queue-num", "0", NULL }; char *argv_L[] = { "iptables", "-L", NULL }; printf("\n[*] iptables -A OUTPUT -j NFQUEUE --queue-num 0\n"); _execv(path, argv_A); _execv(path, argv_L); printf("\n[*] iptables -D OUTPUT -j NFQUEUE --queue-num 0\n"); _execv(path, argv_D); _execv(path, argv_L); return 0; } 이걸 고쳐보면

Continue reading

까먹을 예정이라서 저장 만약 bool을 이용해서 종료를 해왔다면... 예를 들어 이렇게 써왔다면... #include <thread> void func( bool& run ) { while ( run ) { // ... } } int main() { bool run{ true }; std::thread th{ func, std::ref( run ) }; // ... run = false; th.join(); return 0; } 이렇게 바꿔주자. c는 volatile을 사용해서... c11이라면 _Atomic이 있다. #include <thread> #include <atomic> void func( std::atomic< bool >& run ) { while ( run ) { // .

Continue reading

\[ {n\choose k} = \frac{n!}{k!(n-k)!} \] 이항계수의 공식. 얼추 코드로 옮기면 아래처럼 된다. $(0 \le k \le n)$ int f(int n, int k) { return factorial(n) / (factorial(k) * factorial(n - k)) } 일단 재귀로 바꿔보자... f(n, 0)은... \[ f(n,0) = \frac{n!}{0!n!} = \frac{n!}{n!} = 1 \] int f(int n, int k) { if (k == 0) return 1; else return factorial(n) / (factorial(k) * factorial(n - k)) } f(n, k)는.

Continue reading

파서를 만들 때, lex로는 토큰을 만들고, yacc로는 토큰의 조합에 따른 행동을 만든다. 좀 이상하게 설명했는데 야매로 공부해서.. 하여튼 이 글에서 re2c는 lex에 대응하고, bison은 yacc에 대응한다. flex와 bison을 같이 쓰는 예제는 많은데, re2c와 bison을 같이 쓰는 예제는 찾기가 어려웠다. 그래서 re2c에서 bison으로 토큰을 넘기는 예제를 만드는 데 많이 고생했다. 나중에 까먹을게 분명하니까 이렇게 글로 적어놓기로 했다. 그런데 글 다 쓰고 보니까 좀 배운 사람들은 나처럼 고생할 일이 애초에 없을 것 같음;

Continue reading

Author's picture

koyo

컴퓨터할줄모름

Student

Korea