[시스템 프로그래밍] Bomb Lab Phase 4
항상 하던대로 먼저 phase_4의 어셈블리어를 조사하자.
+35줄에서 입력받는 부분이 바로 보인다.
phase_2와 phase_3에서 한 것처럼 입력 형식을 살펴보자.
이번에도 두 개의 정수를 입력받는다.
두 개의 정수이니, 대충 1 2를 입력하고 한 줄 씩 진행해보자.
+40 줄에서 eax값과 2를 비교하고, +43에서 두 값이 다른 경우 폭탄을 터뜨린다.
+40줄에서 레지스터의 값을 확인해보니 rax에 2가 저장돼있었다.
따라서 43줄에서 폭탄은 터지지 않는다.
아마 두 개의 입력이 잘 들어왔는지 확인하는 부분 인 것 같다.
이후 +45줄에서 0xe와 rsp에 있는 값을 비교한다.
rsp에는 입력한 값인 1과 2가 저장돼있다.
+49줄에서 +45줄의 결과에 따라 폭탄을 터뜨린다.
0xe는 10진수로 14이니, rsp의 값은 14보다 작거나 같아야 폭탄이 터지는걸 방지할 수 있다.
계속해서 진행해보자.
+69줄에서 func4함수를 호출한다.
어떤 함수일까? 확인해보자.
func4 내부에서 func4를 다시 호출함을 확인할 수 있다.
일단 이 함수를 통해 어떤 값이 반환될텐데, +74줄을 살펴보니 해당 반환값이 0x23인 경우 폭탄이 터지지 않음을 확인할 수 있다.
그럼 두 번째 값은 0x23이다.
지금까지 얻은 정보를 살펴보면, 첫 번째 값은 14보다 작거나 같은 정수이고 두 번째 값은 0x23을 십진수로 변환한 35이다.
다시 func4를 살펴보자.
일단 func4에 진입하기 직전에 입력한 값이 저장된 rsp레지스터의 값을 edi에 저장한다.
그리고 func4에서는 edi값을 사용한다.
즉, 첫 번째 입력값에 따라 리턴되는 값이 달라지게 되니 0x23을 반환하게 하는 첫 번째 입력값을 구하면 된다.
edx 에는 14 / esi에는 0 / edi 에는 rsp의 값이 저장돼있다.
func4의 +0 ~ +14줄 까지 ebx의 값을 조작하고, +16에서 첫 번째 입력한 값과 ebx의 값을 비교한다.
shr로 ebx를 0으로 설정하고, sar로 ebx를 2로 나누는 등 여러 연산을 수행하는데, 여기서 ebx = (edx + esi) / 2 가 저장된다.
그러니 첫 번째 func4에서 +14줄까지 진행 시 ebx에는 7이 저장된다.
여기서 몇 가지 분기로 나뉜다.
첫 번째로 입력한 값이 7이다 (edx에 저장된 값)
7을 반환한다.
2. 첫 번째로 입력한 값이 edx에 저장된 값 보다 크다
함수를 재귀호출하는데, edx에는 ebx에서 1을 뺀 값이 파라미터로 저장된다.
3. 첫 번째로 입력한 값이 edx에 저장된 값 보다 작다
esi에 ebx에서 1을 더한 값이 파라미터로 저장되고 재귀호출한다.
이제 함수가 어떻게 동작하는지 알고, 함수의 리턴값도 알고 있다.
노가다를 통해 첫 번째 입력값을 구해 보면..
첫 번째 입력값은 8임을 알 수 있다.
'Computer Science > System Programming' 카테고리의 다른 글
[시스템 프로그래밍] Bomb Lab Phase 6 (0) | 2022.12.27 |
---|---|
[시스템 프로그래밍] Bomb Lab Phase 5 (0) | 2022.12.25 |
[시스템 프로그래밍] Bomb Lab Phase 3 (1) | 2022.12.23 |
[시스템 프로그래밍] Bomb Lab Phase 2 (0) | 2022.12.22 |
[시스템 프로그래밍] Bomb Lab Phase 1 (0) | 2022.12.21 |
댓글
이 글 공유하기
다른 글
-
[시스템 프로그래밍] Bomb Lab Phase 6
[시스템 프로그래밍] Bomb Lab Phase 6
2022.12.27 -
[시스템 프로그래밍] Bomb Lab Phase 5
[시스템 프로그래밍] Bomb Lab Phase 5
2022.12.25 -
[시스템 프로그래밍] Bomb Lab Phase 3
[시스템 프로그래밍] Bomb Lab Phase 3
2022.12.23 -
[시스템 프로그래밍] Bomb Lab Phase 2
[시스템 프로그래밍] Bomb Lab Phase 2
2022.12.22