전체 글

PS + hacking
NX NX는 No-eXecute의 약자로, 실행에 사용되는 메모리 영역과 쓰기에 사용되는 메모리 영역을 분리해주는 보호 기법이다. 만약 코드 영역에 쓰기 권한이 있다면 공격자는 코드를 수정하여 원하는 코드를 실행시킬 수 있다. 반대로 스택 영역에 실행 권한이 있다면 Return to Shell과 같은 공격이 가능하다. 만약 CPU가 NX를 지원한다면 컴파일러 옵션을 통해 바이너리에 NX를 적용할 수 있고, NX가 적용된 바이너리는 필요한 권한만 부여받는다. ASLR Address Space Layout Randomization의 약자로, 바이너리가 실행될 때마다 스택, 힙, 공유 라이브러리 등을 임의 주소에 할당해주는 보호 기법이다. ASLR이 적용되면 라이브러리는 임의의 주소에 매핑된다. 그러나 라이브..
· PS/BOJ
https://www.acmicpc.net/problem/10244 10244번: 최대공약수들 n개의 수로 이루어진 수열 A가 주어질 때, 1≤lo≤hi≤n의 정의역을 가지는 함수 f(lo,hi)는 Alo부터 Ahi까지 모든 원소들의 최대공약수로 정의된다. lo와 hi는 수열의 원소가 아닌 인덱스라는 점에 주 www.acmicpc.net 구간 l ~ r 까지의 원소들의 최대공약수를 구했을 경우, 나올 수 있는 정수의 개수를 구하는 문제이다. 우선 주어지는 원소는 100 이하의 자연수이므로, 최대공약수의 개수도 최대 100개임을 알 수 있다. 하지만 i ~ n까지의 부분 집합을 하나하나 계산하기에는 시간적인 문제가 있으므로 이를 완전 탐색으로 접근하기에는 무리가 있어 보였다. 그래서 생각한 것은 1 ~ 1..
validator validator Description 취약한 인증 프로그램을 익스플로잇해 flag를 획득하세요! Hint: 서버 환경에 설치된 5.4.0 이전 버전의 커널에서는, NX Bit가 비활성화되어 있는 경우 읽기 권한이 있는 메모리에 실행 권한 dreamhack.io 문제 분석 주어진 소스코드가 없으므로 IDA를 통해 읽어보았다. main 함수에는 memset, read, validate함수가 존재하고, memset은 read 이전에 나오므로 어떻게 수정할 방법이 없는 것 같아 read 이후인 validate 함수를 해석해보았다. 일단 인자로 s 배열과 128을 넘겼으므로, 아래의 a1 = s, a2 = 128임을 알 수 있다. 위와 같은 코드로 이루어져있는데 이를 해석하는데는 어렵지 않았다..
· PS/BOJ
https://www.acmicpc.net/problem/19953 19953번: 영재의 산책 영재는 알고리즘 문제를 푸는 것을 좋아한다. 하지만 잘 풀지는 못하는 영재는 집중이 되지 않을 때 산책을 한다. 오늘도 집중이 되지 않아 영재는 동네를 산책한다. 영재의 동네는 2차원 좌표로 www.acmicpc.net 처음 속도 v, 방향을 바꾸었을 때 속도 변화량에 영향을 주는 요인 m , 산책 시간 t 로 이루어져있다. 일단 방향을 바꾸면 속도는 (v * m) % 10이 되는데, 곱셈의 특성상 나머지는 4번을 주기로 순환한다. 그렇기에 처음 속도를 제외한 나머지 4번의 속도 연산은 주기를 이룬다. 그러므로 t를 4로 나눈 몫은 고정으로 변하고, 나머지에 따라 최종 위치가 결정된다. 여기서 주의할 점은 v ..
· PS/Atcoder
A - Scoreboard n개의 점수가 주어지고, 각 점수의 최종 합이 더 큰 사람을 출력하는 문제 1 2 3 4 5 6 7 8 9 10 11 12 #include using namespace std; int main() { int n, x, y, a=0, b=0; cin >> n; for (int i = 0; i > x >> y; a+=x, b+=y; } if (a > b) cout
· PS/Atcoder
A - Long Loong n이 주어졌을 때, L, o, n, g로 이루어진 문자열을 출력하는 문제 문자열의 길이는 n + 3이고, 문자열 중 o의 개수가 n개여야한다. 간단하게 L을 출력하고, n개의 o를 출력하고, ng를 출력시키면 된다. 1 2 3 4 5 6 7 8 #include using namespace std; int main(){ int n; cin >> n; cout n; while(1){ cnt*=5; if(cnt>n){ cnt/=5; break; } } check(n, cnt); cout n; for(int i=1; i> dp[i]; for(int i=1; i=0; i--) r[i]=min(r[i+1]+1, dp[i]); for(int i=1; i
baby-bof baby-bof Description Simple pwnable 101 challenge Q. What is Return Address? Q. Explain that why BOF is dangerous. dreamhack.io 문제 분석 일단 해당 파일을 실행시켜보았다. main 함수에서는 win 함수를 호출할 수 없다는 문구와 함께 어떤 주소가 출력되고, 이름을 받았다. 그래서 AAAAAAAAAAAAAA를 입력해보니, 0x7fffb62fdfa0의 값이 AAAAAAAA로 덮여진 것을 볼 수 있었고, 다음 출력된 hex value에 주어진 주소를 넣어보니 count만큼 해당 주소의 값이 변한 것을 확인할 수 있었다. 이를 통해 main 함수의 ret 주소에 win 함수의 주소를 덮어쓰면 ..
· PS/BOJ
https://www.acmicpc.net/problem/2374 2374번: 같은 수로 만들기 n(1 ≤ n ≤ 1,000)개의 자연수 A[1], A[2], A[3], …, A[n]이 있다. 이 자연수에 Add(i)라는 연산을 하면, A[i]가 1만큼 증가한다. 이때, A[i]만 증가하는 것이 아니고, A[i]의 좌우로 인접한 같은 수의 그룹이 한 www.acmicpc.net 배열의 원소를 1씩 더하는데, 인접한 수가 같으면 해당 원소도 1이 더해진다. 최종적으로 모든 원소가 같아지기 위한 연산 횟수의 최솟값을 구하는 문제이다. 해당 문제는 먼저 greedy로 접근을 했었다. 최댓값을 알아내고, 결국 모든 수는 최댓값을 향하므로 최댓값 양측에 존재하는 최솟값들의 연산 횟수를 계산했었다. 1 2 3 4 ..
sy46
벌크업 중인 cpp