전체 384

[C언어] 백준 2748 - 피보나치 수 2

문제 피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가 된다. n=17일때 까지 피보나치 수를 써보면 다음과 같다. 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597 n이 주어졌을 때, n번째 피보나치 수를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 n이 주어진다. n은 90보다 작거나 같은 자연수이다. 출력 첫째 줄에 n번째 피보나치 수를 출력한다. 자료형 때문에 한 번 틀렸는데 숫자 범위를 항상 조심해야 할 것 같다. #include int main..

BOJ(백준) 2021.02.11

[C언어] 백준 2884 - 알람 시계

문제 상근이는 매일 아침 알람을 듣고 일어난다. 알람을 듣고 바로 일어나면 다행이겠지만, 항상 조금만 더 자려는 마음 때문에 매일 학교를 지각하고 있다. 상근이는 모든 방법을 동원해보았지만, 조금만 더 자려는 마음은 그 어떤 것도 없앨 수가 없었다. 이런 상근이를 불쌍하게 보던, 창영이는 자신이 사용하는 방법을 추천해 주었다. 바로 "45분 일찍 알람 설정하기"이다. 이 방법은 단순하다. 원래 설정되어 있는 알람을 45분 앞서는 시간으로 바꾸는 것이다. 어차피 알람 소리를 들으면, 알람을 끄고 조금 더 잘 것이기 때문이다. 이 방법을 사용하면, 매일 아침 더 잤다는 기분을 느낄 수 있고, 학교도 지각하지 않게 된다. 현재 상근이가 설정한 알람 시각이 주어졌을 때, 창영이의 방법을 사용한다면, 이를 언제로..

BOJ(백준) 2021.02.09

[LOB] gate → gremlin

id/pw : gate/gate로 접속 gremlin.c 파일을 열어보았다. strcpy 함수는 복사하는 문자열의 길이를 검증하지 않아 취약점이 발생한다. 먼저 \xff를 \x00으로 인식하는 오류를 피하기 위해 bash2를 사용했다. 권한 문제로 gremlin을 복사한 gremlin2를 gdb로 확인해보자. *main+62에서 buffer가 ebp-256에 있는 것을 알 수 있다. 버퍼의 크기가 256이기 때문에 dummy값은 없는 것 같다. buffer(256) - sfp(4) - ret(4) buffer의 주소를 알기 위해 *main+59에 breakpoint를 설정할 것이다. 그리고 A를 256개 입력해준다. b*main+59 r `python -c 'print "A"*256'` x/100x $e..

[dream hack] Linux Exploitation & Mitigation Part 1 - 1. ELF 동적 분석

강의 링크 ELF 동적 분석 Intro 바이너리를 분석할 때, 바이너리가 실행되며 변화하는 상태를 관찰하기 위해 동적 디버깅이 필요한 경우가 있다. 리눅스의 실행 파일인 ELF파일을 동적으로 디버깅하는 방법에 대해 알아보자. 도구 gdb, strade, Itrade, IDA 등이 있다. gdb의 디스어셈블리 문법에는 AT&T와 intel 두 종류가 있다. 널리 쓰이는 디스어셈블리 문법은 intel이다. gdb 기본 설정에서의 디스어셈블리 문법은 AT&T이기 때문에 intel로 바꿔줘야 한다. .gdbinit는 gdb를 시작할 때 자동적으로 실행할 gdb 명령어들을 저장하고 있는 파일이다. .gdbinit에 gdb의 디스어셈블리 문법을 intel로 바꿔주는 명령어인 set disassembly-flavor..

[dreamhack] Memory Corruption - C (I) 스택 버퍼 오버플로우

강의링크 1. 버퍼 오버플로우 버퍼 오버플로우란? C언어에서 버퍼란 지정된 크기의 메모리 공간이라는 뜻이다. 버퍼 오버플로우는 버퍼가 허용할 수 있는 양의 데이터보다 더 많은 값이 저장되어 버퍼가 넘치는 취약점이다. 발생하는 위치에 따라 스택 버퍼 오버플로우, 힙 오버플로우로 나뉜다. 그 이유는 인접한 메모리를 오염시키는 취약점이기 때문에 어떤 메모리를 오염시킬 수 있는지에 따라 공격 방법이 달라지기 때문이다. 스택 버퍼 오버플로우 스택 버퍼 오버플로우는 지역 변수가 할당되는 스택 메모리에서 오버플로우가 발생하는 경우다. 8 바이트의 버퍼 A와 8바이트 데이터 버퍼 B가 메모리에 선형적으로 할당되었다고 생각해보라. 버퍼 A에 16바이트의 데이터를 복사한다면 이 데이터의 뒷부분은 버퍼 A를 넘어 뒤에 있는..

[C언어] 백준 2941 - 크로아티아 알파벳

문제 예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다. č c= ć c- dž dz= đ d- lj lj nj nj š s= ž z= 예를 들어, ljes=njak은 크로아티아 알파벳 6개(lj, e, š, nj, a, k)로 이루어져 있다. 단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다. dž는 무조건 하나의 알파벳으로 쓰이고, d와 ž가 분리된 것으로 보지 않는다. lj와 nj도 마찬가지이다. 위 목록에 없는 알파벳은 한 글자씩 센다. 입력 첫째 줄에 최대 100글자의 단어가 주어진다. 알파벳 소문자와 '-', '='로만 이루어져 있다. 단어는 크로아티아 알파벳으로 이루어져 있다. 문제 설명의 표에..

BOJ(백준) 2021.02.07

[C언어] 백준 1712 - 손익분기점

문제 월드전자는 노트북을 제조하고 판매하는 회사이다. 노트북 판매 대수에 상관없이 매년 임대료, 재산세, 보험료, 급여 등 A만원의 고정 비용이 들며, 한 대의 노트북을 생산하는 데에는 재료비와 인건비 등 총 B만원의 가변 비용이 든다고 한다. 예를 들어 A=1,000, B=70이라고 하자. 이 경우 노트북을 한 대 생산하는 데는 총 1,070만원이 들며, 열 대 생산하는 데는 총 1,700만원이 든다. 노트북 가격이 C만원으로 책정되었다고 한다. 일반적으로 생산 대수를 늘려 가다 보면 어느 순간 총 수입(판매비용)이 총 비용(=고정비용+가변비용)보다 많아지게 된다. 최초로 총 수입이 총 비용보다 많아져 이익이 발생하는 지점을 손익분기점(BREAK-EVEN POINT)이라고 한다. A, B, C가 주어졌..

BOJ(백준) 2021.02.07

[C언어] 백준 1037 - 약수

문제 양수 A가 N의 진짜 약수가 되려면, N이 A의 배수이고, A가 1과 N이 아니어야 한다. 어떤 수 N의 진짜 약수가 모두 주어질 때, N을 구하는 프로그램을 작성하시오. 입력 첫째 줄에 N의 진짜 약수의 개수가 주어진다. 이 개수는 50보다 작거나 같은 자연수이다. 둘째 줄에는 N의 진짜 약수가 주어진다. 1,000,000보다 작거나 같고, 2보다 크거나 같은 자연수이고, 중복되지 않는다. 출력 첫째 줄에 N을 출력한다. N은 항상 32비트 부호있는 정수로 표현할 수 있다. 문제에서 진짜 약수를 모두 제시하기 때문에 가장 작은 약수와 가장 큰 약수를 곱해주기만 하면 된다. 처음에 약수들을 크기순으로 정렬했어야 하는데 안해서 틀렸다. #include int main(void){ int n, num,..

BOJ(백준) 2021.02.07

2주차 C 과제

1. 두 개의 문자열 s1, s2를 입력 받고, s1과 s2에 같은 index에 있는 문자들을 비교해서 같으면 O, 다르면 X를 출력하시오 문자열의 길이는 모두 30을 넘지 않음문자 비교 중 공백일 경우 X를 출력함포인터 사용 [입력 예시]structstarcity​[출력 예시]OOXXOXXX​#include #include int main(void){ char s1[30], s2[30]; char *w1 = s1; char *w2 = s2; int i, len; scanf("%s", w1); scanf("%s", w2); if(strlen(w1)>strlen(w2)){ len = strlen(w1); }else{ len = strlen(w2); } for(i=0; i문자열 두 개를 정의하고 입력받는..

C 2021.02.07