목록문제풀이 (3)
안 쓰던 블로그

그래프에서 사이클 구간 찾는 문제 문제 이해 자체는 쉬운데 구현이 어려웠다 사이클을 찾아야 하는데, 다른 사람들 글을 보니까 finish배열을 써서 finish가 체크가 아닌데 visit는 체크이면 사이클이고 그런다던데 뭔소린지 직관적으로 이해되지 않아서 이해하는 데 좀 걸렸다 1. 사이클 확인 그래서 내 나름대로 이해해 보았는데, finish배열말고 아래처럼 생각하면 좋더라 void dfs(int now) { int next = v[now]; //가리키는 거 if (visit[next]) { //방문을 했던 노드인데 또 탐색하러 오게 되면 사이클이다 //구현 } visit[now] = 1; dfs(next); //다음 경로 } dfs를 돌면서 보통 이렇게 방문을 체크하고, 방문하지 않았으면 dfs를 또..

size를 입력 받은 다음 데이터를 입력 받는 문제 소스코드를 보면, get_shell함수가 보이고 main에 buf, size 등이 있다 메모리에는 다음과 같이 들어갈 것이다 생략 .... size buf main's sfp main's ret 전형적인 bof문제같이 보이는데, 한 가지 문제가 있다면 if문에서 너무 큰 사이즈를 넘겨버린다는 점이다 그냥 무작정 256를 넘는 범위를 보내면 if문에서 걸러진다 그러면 어떻게 size를 주어야 if문에 안 걸리고 256이 넘는 데이터를 보낼 수 있을까? 드림핵에 이 강의(dreamhack.io/learn/2/12#11)를 참고하라고 하면서 힌트를 준다 int범위는 -2^31 ~ 2^31-1 의 범위를 갖는다 또한 int같은 변수들은 최대 범위를 넘어가면 다..

먼저 메인 함수를 본다. main을 보면 구조는 이전 문제들이랑 다르지 않다 함수에 들어가 본다 RCX(입력값)을 RSP+8 주소에 가져온다 RSP에 18만큼의 공간을 준비한다 RSP주소에는 0을 넣는다 JMP한다 CMP RAX, 1C를 하는데 RAC와 1C를 비교하는 것 결과값이 ~65주소보다 크거나 같으면(JAE) EAX에 1을 넣고 RSP에 18을 더하면서 종료된다 계속 비교하며 반복하는 모습이 보이니 즉 이 부분은 for문이다 for(int i=0; i>4 연산인 것이다 이 연산이 끝나면 RAX가 4가 된다 RDX에 다시 Hello를 가져온다(RSP+20 주소) ECX에 rdx+rcx*1: "Hello"를 한다 ECX에 'H'인 48이 들어간다 SHL은 왼쪽 쉬프트 연산. ECX가 원래 48이었는..