[시스템 프로그래밍] Bomb Lab Phase 6
disas phase_6 명령어로 phase_6의 어셈블리어를 조사하자.
phase_6은 마지막 페이즈라서 그런지 어셈블리 코드가 정말 길다.
일단 익숙한 함수인 read_six_numbers가 보인다. 이번에도 6개의 정수를 입력받는 것 같다.
항상 하던대로 phase_6에 브레이크를 설정하고 아무 숫자나 입력해보자.
대충 3 4 5 6 7 8을 입력했다.
이제 어셈블리어의 흐름을 쭉 따라가보자.
+34 : read_six_numbers 함수를 호출해 6개의 정수를 읽는다.
+42 : r14d에 0을 저장한다.
+48 : +87줄로 점프한다.
r13에는 처음 입력한 숫자인 3이 저장돼있다.
+87과 +90줄에서 r13값을 rbp와 eax에 저장한다.
+94 : eax에서 1을 뺀다.
+97 : eax에서 1을 뺀 값이 5보다 크면 폭탄을 터뜨린다.
3-1은 5보다 작으니 다음 명령어로 이동한다.
+102 : r14d에 1을 더한다.
+106 ~ +115줄을 살펴보면 r14d가 6인지 확인하고, 6이면 +117줄로, 6이 아니면 r14d의 값을 ebx에 저장하고 +65줄로 점프한다.
아직은 r14d값이 6이 아니기 때문에 +65줄로 점프하자.
+65 : ebx의 값을 rax에 저장한다.
+68 : eax에 rsp + 4 * rax 값을 저장한다.
rsp에는 입력값인 3 4 5 6 7 8이 저장돼있다.
첫 반복에서 rax는 1이다. 따라서 eax에는 두 번째 입력값인 4가 저장돼있고, 현재 rbp에는 처음 입력인 3이 저장돼있다.
따라서 +71줄에서 두 값을 비교해 +57로 점프한다.
ebx에 1을 더하고
ebx 값이 5보다 큰지 확인한다.
이 다음부터는 같은 내용이 반복된다.
ebx값이 5보다 커질 때 까지 ebx값을 증가시키고, 증가시킨 ebx를 rax에 넣고 다시 +71줄을 실행하고..
여기서 비교하는 수가 같은 경우 폭탄을 터뜨린다.
따라서 입력받는 모든 수는 서로 달라야 함을 알 수 있다.
ebx 값이 5보다 커지면 +83줄로 점프한다.
+83 : r13에 4를 더한다.
+87 : rbp에 r13을 저장한다.
+90 : r13주소의 값을 eax에 저장한다.
이후 다시 반복문을 돈다.
이번에는 r14레지스터를 사용해서 r14레지스터의 값이 6이 넘어가면 반복문을 탈출한다.
반복문을 통해 입력으로 들어오는 정수들은 모두 6 이하이고, 각각의 값이 모두 달라야 한다는 정보를 얻을 수 있다.
즉, 처음에 입력한 3 4 5 6 7 8은 조건을 만족시키지 못한다.
적당히 3 4 5 6 1 2를 다시 입력해보자.
명령어를 한 줄씩 계속 수행하면
반복문을 탈출할 수 있다.
+117줄부터 다시 진행해보자.
+117 : rcx에 r12 + 0x18 값을 저장한다.
+122 : edx에 7을 저장한다.
+127 : eax에 edx값을 저장한다.
+129 : eax에서 (%r12) 값을 뺀다.
r12주소의 값은 첫 번째 정수이다.
+133 : r12에 eax값을 저장한다.
7 – 3인 4가 eax에 저장된다.
+141, +144 : 다시 분기점이다. r12와 rcx의 값이 같으면 다음 명령어로, 틀리면 위의 작업을 다시 반복한다.
rcx의 값은 위에서 0으로 설정되기 때문에 r12값이 0으로 설정되면 반복문을 탈출한다.
+146 : esi에 0을 저장한다.
+151 : +179줄로 점프한다.
+151을 지나는 시점에서 입력값을 확인 해 보니, 각각의 입력값들이 7에서 입력값을 뺀 결과로 바뀌었음을 확인할 수 있다.
즉, 반복문이 제대로 수행됨을 확인할 수 있다.
+179 : ecx에 rsp + 4 * rsi 값을 저장한다.
rsp는 0이기 때문에 일단은 첫 번째로 입력한 정수가 들어간다.
+182 : eax에 1을 저장한다.
+187 : rdx에 0x202c73 + rip 값을 저장한다.
+194 +197 : 분기점이다. ecx가 1보다 큰지 확인하고, 큰 값이면 +153으로 점프한다.
+153 : rdx에 rdx + 8 주소에 있는 값을 저장한다.
157 : eax에 1을 더한다.
+160 +162 : ecx와 eax가 같아질 때 까지 반복한다.
계속해서 명령어를 실행시켰고, 모든 반복문에서 탈출해 이제 +201줄에 위치해있다.
좀 더 뒤의 상황을 살펴보자.
+283줄에서 eax와 rbx의 값을 비교해 rbx의 값이 더 크면 폭탄을 터뜨린다.
여기서 감이 왔다. 내림차순으로 정렬해 줘야 한다.
이전에 반복문을 열심히 돌면서 정렬한 Node의 값을 사용할 때이다.
Node의 값을 열어보자.
Node6에 대한 정보는 다른 노드들을 통해서 간접적으로 알아야 한다.
이제 모든 노드들의 정보를 얻었다.
각각의 노드들을 내림차순으로 정렬하되, 입력값은 7의 보수로 처리되니 정답을 입력 할 때는 7에서 빼 준 값을 입력하자.
그러므로 정답은 3 5 1 2 6 4 이다.
'Computer Science > System Programming' 카테고리의 다른 글
[시스템 프로그래밍] Malloc Lab Implicit (1) (0) | 2023.01.10 |
---|---|
[시스템 프로그래밍] Bomb Lab Phase Secret (0) | 2022.12.30 |
[시스템 프로그래밍] Bomb Lab Phase 5 (0) | 2022.12.25 |
[시스템 프로그래밍] Bomb Lab Phase 4 (0) | 2022.12.24 |
[시스템 프로그래밍] Bomb Lab Phase 3 (1) | 2022.12.23 |
댓글
이 글 공유하기
다른 글
-
[시스템 프로그래밍] Malloc Lab Implicit (1)
[시스템 프로그래밍] Malloc Lab Implicit (1)
2023.01.10 -
[시스템 프로그래밍] Bomb Lab Phase Secret
[시스템 프로그래밍] Bomb Lab Phase Secret
2022.12.30 -
[시스템 프로그래밍] Bomb Lab Phase 5
[시스템 프로그래밍] Bomb Lab Phase 5
2022.12.25 -
[시스템 프로그래밍] Bomb Lab Phase 4
[시스템 프로그래밍] Bomb Lab Phase 4
2022.12.24