[시스템 프로그래밍] Bomb Lab Phase 2
disas phase_2 명령어로 phase_2 함수를 어셈블리어로 살펴보자.
+25줄에서 <read_six_numbers> 함수를 호출한다.
이름 그대로 6개의 숫자를 입력받는 것 같은데.. 어셈블리어로 살펴보자.
+41줄에 scanf 함수를 볼 수 있는데, 역시 숫자를 입력받는게 맞는 것 같다.
레지스터를 열어 보니 확실히 6개의 정수를 입력받는다.
나머지 내용은 잘 모르겠고.. 일단 read_six_numbers 함수에서 여섯 개의 정수를 입력받는다는 사실을 알아냈다.
다시 phase_2 함수로 돌아오자.
+30줄에서 스택의 첫 번째 수가 1인지 확인하고 있다.
+34줄에서 zero flag가 0이면 +45줄로 가서 폭탄을 터뜨린다.
아하! 스택의 첫 번째 값은 1이구나!
즉, 6개의 정수를 입력받을 때 첫 번째로 입력받는 정수는 1 인 것 같다.
계속해서 흐름을 따라가보자.
+36 : rsp값을 rbx에 옮긴다.
+39 : rbp에 0x14 + rbx 연산 결과를 저장한다.
+43 : +61줄로 점프한다.
+61 : eax에 rbx를 따라가서 얻는 값을 저장한다.
+63 : eax를 두 배 한다.
+65 : eax값과 0x4(%rbx) 값을 비교하는데.. +68줄을 보니 여기서 두 값이 같지 않으면 폭탄이 터진다.
rbx에는 처음 입력한 값이 저장돼있다.
즉, +61 +63 +65줄을 살펴보면 이전 값의 두 배가 현재 값이 됨을 알 수 있다.
그러니 일단 두 번째 수는 2 인 것 같다.
다음으로는 +52줄로 점프한다.
+52 : rbx에 0x4를 더한다.
+56 : rbp와 rbx값을 비교한다. rbp에는 rbx에 0x14를 더한 값이 들어있는데, 0x14는 10진수로 20이다.
따라서 이 줄에서는 4바이트씩 6개의 숫자를 모두 비교했는지 확인하는 부분이다.
6개의 숫자를 모두 비교 할 때 까지 +61 +63 +65의 반복이다.
즉, 처음 값은 1이고 이후 값은 공비가 2인 등비수열을 이룬다.
1 2 4 8 16 32
위의 수열이 정답인 것 같다. 입력해보자.
'Computer Science > System Programming' 카테고리의 다른 글
[시스템 프로그래밍] Bomb Lab Phase 4 (0) | 2022.12.24 |
---|---|
[시스템 프로그래밍] Bomb Lab Phase 3 (1) | 2022.12.23 |
[시스템 프로그래밍] Bomb Lab Phase 1 (0) | 2022.12.21 |
[시스템 프로그래밍] Data Lab (0) | 2022.12.20 |
[시스템 프로그래밍] 동적 메모리 (1) | 2022.11.30 |
댓글
이 글 공유하기
다른 글
-
[시스템 프로그래밍] Bomb Lab Phase 4
[시스템 프로그래밍] Bomb Lab Phase 4
2022.12.24 -
[시스템 프로그래밍] Bomb Lab Phase 3
[시스템 프로그래밍] Bomb Lab Phase 3
2022.12.23 -
[시스템 프로그래밍] Bomb Lab Phase 1
[시스템 프로그래밍] Bomb Lab Phase 1
2022.12.21 -
[시스템 프로그래밍] Data Lab
[시스템 프로그래밍] Data Lab
2022.12.20