
phase_4 문제의 입력은 “%d %d”로 입력을 받는다. 입력값이 2개가 아니면 explode_bomb이 실행되므로 입력은 두 개의 정수를 받는다.
첫 번째 입력값과 15를 비교해 입력값 >= 15라면 jump문이 실행돼 explode_bomb이 실행되므로 첫 번째 입력값은 15보다 작아야 한다는 것을 알게 되었다.
edx, esi, edi를 각각 x, y, z로 봤을 때 x = 15, y = 0; z = 첫 번째 입력값임을 <+56>, <+61>, <+66> 라인을 통해 알 수 있다.

그 후 func4가 실행되는데 func4의 코드를 보기 전에 phase_4가 끝나는 조건을 아래에서 먼저 찾는다. <+74>를 봤을 때 func4이 끝나고 return된 eax의 값을 18과 비교를 한다. eax != 18이라면 explode_bomb이 실행되므로 func4를 실행하고 나올때의 값이 18이 되어야 phase_4가 해결됨을 알 수 있다.

이제 해결조건을 알았으니 disas func4를 통해 func4의 코드를 본다.

func4 함수 실행 직전에 값을 담아놓은 register가 func4에서도 쓰이는 것을 보아하니 x, y, z는 func4의 인자로 쓰이는 것을 알 수 있다.
func4에서 결과를 return하는 eax레지스터에 x의 값을 넣고, y의 값을 빼서 이것을 ebx 레지스터에 이동시킨다. 그 후 ebx를 31번 shift right를 실행시켜 msb만 남기고, 거기에 y를 더한다. 그렇게 값을 바꾼 ebx를 arithmetic shift를 해주고, z와 ebx의 값의 비교를 통해 ebx > z이면 rbx를 eax에서 뺀 후 다시 func4 실행, ebx < z이면 rbx를 eax에서 더한 후 다시 func4 실행, 같으면 func4 함수 종료를 실행한다.
이 func4의 실행 결과를 1부터 14까지 실행시켜 얻은 값을 보면 다음와 같다.

그러므로 위의 표를 토대로 func4를 실행했을 때 return되는 값이 18이 되는 입력값은 11이므로 정답은 11 18이 된다.

이렇게 bomblab phase_4 clear!