[sysp] bomblab phase_5

정민경·2022년 11월 1일
0

bomblab

목록 보기
2/2
post-thumbnail


입력은 “%d %d”로 정수 두 개를 입력받는다. 그리고 저번 phase와 마찬가지로 입력받은 정수의 개수가 1개보다 적거나 같다면 폭탄이 터지게 된다.

입력받은 값을 eax 레지스터에 이동시키고, 0xf와 and연산을 시키는데 이때의 값과 0xf와 같다면, 즉 가장 뒤 바이트가 0xf면 폭탄이 터지게 된다. 터지지 않았다면 ecx, edx에 0을 저장하고, rip에 있는 주소를 rsi에 저장하는 것을 볼 수 있다. 이 주소값은 <array.3417>이 저장되어있는 주소고, 이름에서 보이다시피 배열인 것 같아 x/32d로 확인을 하게 되었다.
int의 크기인 4byte마다 숫자가 저장되어있었고, [10, 2, 14, 7, 8, 12, 15, 11...] 을 볼 수 있었다.

edx에 저장된 값을 1 증가시킨 다음 cltq를 실행해 eax의 부호를 확장해 rax에 저장한다. 그 다음 배열의 시작주소 rsi에서 rax*4만큼 즉, array[%rax]에 있는 값을 eax에 저장하고, 0xf와 비교해 같지 않으면 <+76>으로 돌아간다. 즉 코드가 종료되기 위해서는 다음코드로 진행해야하므로 array[%rax] == 0xf == 15이어야 한다. x/32d로 배열을 확인했을 때 15의 값을 저장하고 있는 index는 6이다. 그래서 첫 번째 값을 6이라고 예측 후 계속 코드 진행해본다.

<+98>에서 edx와 15를 비교해 다르면 폭탄이 터지는 jump분기가 있다.

edx는 <+76>에서 edx+=1의 코드에서만 증감이 일어나므로 rax와 edx모두 15인 경우를 찾으면 된다.
이 과정은 첫 번째 입력을 1부터 차례로 1씩 증가시켜 입력하고, 두 번째 입력은 아무 숫자나 입력해서 실행때마다 info register를 통해 register의 값을 확인했다. 첫 번째 입력숫자가 5일 때 rax와 rdx모두 15가 나왔다. 이 때의 rcx가 115였으므로 5 115가 정답이 된다.

(5 1 입력시 register의 값)

따라서 5 115 를 입력하면 phase_5 clear!

0개의 댓글