phase_6은 유형이 총 4가지가 있다. 여태 다른 페이즈와 달리 여기의 유형들은 거의 같다.
그래서, 정 모르겠으면 야매로 찍어서 최대 4번만에 맞출 수 있다.
유형 구분의 의미가 없어서 바로 본론으로 들어간다.
밤랩 1251056 을 예시로 들겠다.
입력을 6개 받고, 쭉 보다 보면 입력값에 중복을 확인하는 2중 루프가 보이고..
경험상 disas phase_6을 했을 때 300번대에서 끝난다면 무조건 7로 빼주는 부분이 존재한다.
<+36> 에서 mov %rsp %r12를 해주고 위에 사진처럼 <+116>부터 하나 씩 7로 빼주기 시작한다.
<+181> 쪽에서 0x6024f0을 가지고 반복을 하면서 무언가를 하더라. 그래서 다 끝나고 확인해봤다.
<+252> 쪽에 break를 걸고 %rbx를 확인해봤다. -0x20을 한 것은 실수로 c를 쳐서 예쁘게 보이게 하려고 했다.
phase_6 진입할 때 임의로 3 4 5 6 1 2를 치고 들어갔다. (<+116>에서 7로 빼줬으니 4 3 2 1 6 5라고 생각하자.)
node+0x8 부분이 변화한 것을 알 수 있다. node+0x8 이 의미하는 것이 다음 노드의 주소이다. <+181> 쪽에서 반복문을 수행하면서 node+0x8 부분을 입력값에 맞게 변화시킨 것이다.
즉, 위 입력 상황에서 node4 node3 node2 node1 node6 node5 순서대로 방문한다.
이제 마지막이다.
우선, 를 번째에 방문하는 라고 하자.
%rbx가 라면, %eax는 이고 %eax와 %rbx의 조건을 맞춰야 폭탄이 터지지 않는다.
그 조건이라 함은 jge, jle 두 가지만 나오기 때문에 jge 내림차순, jle 오름차순 이다.
위 상황에서는 가 내림차순이 되도록 입력을 해야한다.
<+181> 의 0x6024f0을 보면 node2, node5, node4, node3, node6, node1 으로 하면 내림차순으로..
2 5 4 3 6 1이 답이라고 생각하겠지만 위에서 7로 빼줬기 때문에, 5 2 3 4 1 6이 답이다.
결론은 다음과 같다.
7로 빼주냐 안빼주냐? 오름차순이냐 내림차순이냐. 이렇게 경우의 수가 2*2로 4가지가 나온다.
정 모르겠으면 0x6024f0 을 정렬시키고 입력해보고 안되면 거꾸로 정렬해보고. 안되면 7로도 빼보면 정답이 될거다.