Bomblab - Phase 6

LONGNEW·2021년 10월 10일
2

Bomb

목록 보기
6/7

폭탄 출처 : Bomb from "Dr.Evil"

no. 1251056



<+31> read_six_numbers
전까지의 스택 상황이다. 매우 큰 배열? 공간을 뚫어 뒀다.
함수의 이름을 보아 6개의 숫자를 입력 받나 보다.

레지스터를 확인해보니 입력한 6개의 숫자는 $rsp를 기준으로 4바이트 씩 차지하며 저장되어 있다.


<+61> cmp $0x5, %eax
%eax가 작거나 같은 경우에 분기를 한다. in[0] - 1이 %eax에 저장되어 있기 때문에 하나의 조건을 알 수 있다.

in[0] <= 6

<+72> cmp $0x6, $r14d
이 둘을 비교해서 동일한 경우에는 <+111>로 분기를 한다. 그러나 아직은 폭탄이 있는 곳은 아니다.

분기가 되지 않은 경우 -> 반복문의 시작.


<+81> movslq %ebx, %rax
부호확장을 하라는 명령어로 현재 %ebx에는 %14d를 가리키고 얘는 1을 가지고 있으니까 %rax는 1을 가지게 될것 같다.
<+87> cmp %eax, 0x0(%rbp)
in[1]과 in[0]를 비교해서 동일하지 않아야 폭탄이 터지지 않도록 분기한다.

in[0] != in[1]

하 또 반복문이다.....
5번 돌아야 한다. 돌면서 생각을 해 봐야할 듯 싶다.

이 반복문에서는 그냥 in[0] != in[1 ~ 5] 모든 원소가 0번째랑 달라야 함.


그러고 나서는 <+48>로 이동.. 레전드네..

현재 %rax = 6 이미 반복문을 5번 돌았기 때문에.


느낌이 계속 이렇게 반복을 하면서 다시
<+58>
비교를 수행, 위에서 한 번 작성했던 것이기 때문에 그냥 보면 모든 원소는 5보다 6보다 작아야 한다.

2중 반복문이다. %r14d를 i로, %rax를 j로 볼 수 있을 것 같다.

암튼 이 반복문이 끝나고 나서,


<+111>로 오고나서 다음 명령어들을 수행한다.

<+138>에 또 위로 돌아오는 명령이 있는 걸로 보아 이것도 반복문인거 같다.

이런 방식으로 현재 원소의 값을 7에서 뺀 결과로 모두 교체한다.


이 반복문이 끝난 후

<+173>에서 모든 레지스터를 초기화 하고 %rdx에는 0x6042f0의 주소를 저장하고 있다. 그 값이 가지는 정보들은 아래의 사진과 같다. 아직 문자열인지, 16진수인지는 잘 모르겠다.


<+147>로 이동 여기에서 주소를 더하고 rax를 업데이트 한다.

<+154> cmp %ecx, %eax
를 해서 두개가 다르다면 <+147>로 이동한다, 두개가 같을 때 까지 움직인다...

$rsp + 0x20 를 기준으로 1바이트씩 16진수가 어떻게 변하는지 확인해보고, 1 2 3 4 5 6 순서 말고 다르게 넣었을 때 rdx가 가지는 정보가 어떻게 되는지 보자.



두 개의 원소들을 꺼내서 비교를 한다.
1 2 3 4 5 6 을 넣었을 떄
$eax = 0x36e [node 5에 저장, 0x604330 에 있는 정보]

$rbx = 0x156 [node 6에 저장, 0x604340 에 있는 정보]

일단 이렇게 꺼낸다는 것을 확인했으니 eax에 오는 정보들이 더 작도록 만들어 보겠다.

인덱스 i, i + 1을 비교할 때
$eax == data[i + 1]이고, $rbx == data[i]이기 떄문에 내림차순으로 정렬을 해서 rbx가 더 크도록 해야 한다.

이렇게 phase 6를 종료하겠다.

[2021.10.19]

<+43 ~ +104> 입력 값들 중에 동일한 값이 있는지 확인하는 2중 반복문.

0개의 댓글