CSE/시스템프로그래밍

[BombLab] phase_6 해설

잔디🌿 2024. 9. 11. 17:02

드디어 마지막이다!

마지막인만큼 좀 길다ㅜㅜ

 

phase_6 disassemble

이제 이 부분을 보면 6개의 숫자를 입력받는 phase라는 것을 유추할 수 있다.

 

나는 임의로 1 2 3 4 5 6을 넣어보겠다.

 

위 코드들을 보면 $r13에 있는 수가 eax로 들어가고, eax에 있는 수에서 1이 한번 빼진 후 5와 비교를 한다.

만약 6보다 작거나 같으면 52번으로 넘어가고 그렇지 않으면 폭탄이 터진다.

그럼 r13에 우리가 입력한 값들이 들어있다는 것을 유추할 수 있다. 확인해보면

맞다. 이를 통해 처음 입력하는 숫자는 6보다 작거나 같아야한다는 것을 알 수 있다.

 

여기서는 이중 반복문이 실행된다.(32에서 93, 65에서 87)

52번으로 분기 한 후 r12d에 1을 더한다. 지금 r12에는 0이 들어있으니까 여기다가 1을 더해가면서 모든 수를 한번씩 확인한다는 것을 알 수 있다.

그 다음 r12에 있는 값을 rax에 넣고, rsp에서 rax*4만큼 이동한 수를 eax에 넣는다. 그리고 이 값을 현재 rsp에 있는 값이랑 비교한 후 같으면 폭탄을 아니면 81번으로 분기한다. 이는 r12번째 수와 현재 rbp에 있는 수를  비교하여 같지 않은지를 확인하는 과정이다.

 

이를 종합해보면 입력 한 6개의 숫자들 중 중복이 없어야 한다는 것을 유추할 수 있다. 또한 32번으로 가서 현재 탐색하고 있는 숫자가 6보다 작거나 같은지 확인하는 과정이 있어서 모든 수는 6보다 작거나 같아야한다는 것도 알 수 있다.

 

 

이제 두번째 반복문이다. ecx에 7을 넣고, 이를 edx에 넣는다. 그 다음 edx에 있는 값에서 rax 주소 내의 값을 뺀다. 그 다음 rax에 4를 더하고 다시 108번으로 돌아간다. 이건 7에서 각각 입력받은 수를 빼는 과정이라는 것을 유추할 수 있다.

실제로 확인해보면 

이렇다!

 

다음 반복문이다. 

esi에 0을 넣고, 163번으로 분기한다. 그 다음 ecx에 rsp로부터 rsi만큼 떨어진 값, 즉 여기서는 7- 첫번째로 입력한 값이 들어간다. 그 다음 이 값을 1과 비교하여 작거나 같으면 143으로 분기한다.

하지만 우리는 작거나 같지 않으니까 171로 이동한다.

eax에 1을 넣고, edx에 특정 주소에 있는 값을 넣는다. 이 값을 확인해보면 

<node1> 이라는 글자와 함께 332라는 숫자를 확인할 수 있다.

여기서 8을 더한 값을 출력해보면 이렇게 주소가 하나 나온다. 이 주소를 따라가보면

node2가 나온다. 이로서 노드들은 linkedList로 연결되어있다는 것을 알 수 있다.

 

 

이후 130으로 점프를 하는데 여기서는 rdx에 8을 더한다. ni명령어로 실행한 후 이 주소에 있는 값을 확인해보면

 

앗 16진수로 출력했다. 10진수로는 168이다. 이렇게 모든 노드 값을 확인해보면

1 : 332

2 : 168

3 : 924

4 : 691

5 : 477

6 : 443

이다.

 

0다음 이 부분을 보면 rsp+32에다가 노드에 있는 수들을 넣는 것을 볼 수가 있다. (rsp는 스택)

이 반복문을 다 빠져나간 183번에 breakpoint를 걸고 실행 한 후 rsp+32에 있는 값들을 보자

그럼 스택 안에 주소값들이 있다 이 값들을 차례로 확인해보면 7 - 우리가 입력했던 수 순서로 노드의 주소가 들어간 것을 볼 수 있다.

 

183,188,193에서는 rbx, rax, rsi값을 저장한다. 이 때 rbx는 mov를 해서 주소 내에 있는 값이 들어가고, rax와 rsi에는 주소 값이 직접 들어간다.

여기서 또 반복문이다.

rsp + 8한 주소 내의 값을 rdx에 넣는다. 그 다음 이 값을 rcx + 8에 넣고, rax를 8 증가시킨다. 

그 다음 조건문을 지난 후 rdx에 있는 값을 rcx로 옮긴다. 이 과정은 현재 스택에 있는 순서대로 linkedList를 변화시키는 것이다. 

 

확인해보면 위와 같이 7-우리가 입력한 수 순서대로 linkedList가 만들어진 것을 볼 수 있다.

 

마지막 반복문이다 여기서는 241번줄에서 eax와 (rbx)값을 비교한다. 이 값들을 꺼내보면

rbx에는 6번 노드의 값이 들어가있고

rax에는 5번 노드가 들어가있다. 이 두 값을 비교한 것 중에 뒤에 있는 값이 더 커야한다. 이후 rbx가 늘어나면서 반복문이 진행되는 것을 보니 linkedList는 오름차순으로 정렬되어있어야한다는 것을 알 수 있다.

 

그러면 우리는 3,4,5,6,1,2순서대로 정렬해야하는데, 7에서 입력한 값을 빼는 과정이 있으니까 

답은 4 3 2 1 6 5라는 것을 알 수 있다.

 

정답

4 3 2 1 6 5

 

이렇게 해서 모든 폭탄을 해체하였다!!!!!

 

밤랩을 한번 풀어보았는데 아마 여러분들이 과제로 받는 코드랑은 약간 다를 수 있다. 

하지만 유형은 비슷할 것이니 열심히 풀어보면 분명 스스로 해체할 수 있을 것이다!

 

화이팅