본문 바로가기
CSE/시스템프로그래밍

[BombLab] phase_6 해설

by 잔디🌿 2024. 9. 11.

    드디어 마지막이다!

    마지막인만큼 좀 길다ㅜㅜ

     

    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

     

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

     

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

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

     

    화이팅

    'CSE > 시스템프로그래밍' 카테고리의 다른 글

    [BombLab] 환경설정  (1) 2024.10.06
    [BombLab] phase_5 해설  (1) 2024.09.10
    [BombLab] phase_4 해설  (0) 2024.09.09
    [BombLab] phase_3 해설  (0) 2024.09.03
    [BombLab] phase_2 해설  (0) 2024.09.02