Bomblab - Phase5

LONGNEW·2021년 10월 10일
1

Bomb

목록 보기
5/7

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

no. 1251056

<+33> sscanf 함수
이전까지의 스택 상황이다. 이번에도 2개의 숫자를 입력받기 위해 레지스터를 할당하는 모습을 볼 수 있다.


<+57> cmp $0xf, %eax
위에서 AND 연산을 한 후의 in[0]를 다시 $0xf와 비교합니다. 이 때 두 숫자가 일치하는 경우에 폭탄이 터집니다. 일치하지 않도록 만들어야 합니다.

in[0] != 15

<+75> cltq
word 길이의 데이터를 double word로 늘려주는 명령어, 원래의 값을 유지하고 크기를 늘린다고 생각.

<+77> mov 0x402540(,%rax,4), %eax
0x402540 + $rax * 4에 존재하는 값을 %eax로 옮김.

<+89> cmp $0xf, %eax
이 둘을 비교해서 동일하지 않은 경우에는 위의 과정을 계속 반복하게 해서 누적되는 값을 얻습니다.

0xf가 저장되어 있는 위치는 0x402540 + 24(== 0x18)

in[0] == x (x & 15 == 24 / 4 = 6)

마지막에 %eax에 저장되어 있는 값은 0x402540(,%rax,4) 즉, 4가 곱해진 값이다 결국 AND 연산을 했을 때 6을 얻어야 한다.

<+98> cmp $0xf, %edx
두 개가 다른 경우에 폭탄이 터진다. 그래서 %rdx를 건드릴 수 있는 곳이 어디일까...

근데 그거도 그거인데 아래의 명령어 주소에서
<+103> cmp 0x4(%rsp), %ecx
둘을 비교해서 둘의 값이 동일해야 한다. 지금까지 in[1]을 한번도 쓰지 않았는데 그게 여기서 나왔다. 이 떄 %ecx는 위의 명령어대로 막 움직이다가 마지막에 15를 저장하게 된다. 이를 보면

in[1] == 15 ?? 근데 그 전에 edx 부터 어떻게 할지 보자.

의도적으로 반복문을 15번 돌아서 %edx를 15로 만들어야 한다.

<+89> jne [something]
주소를 보게 되면 이다. 여기에서 15번을 돌게 되면 %edx를 15로 만들 수 있다. 그러면 in[0]를 6이 아닌 더 작은 걸 넣어야 하나??

그러니까

배열로 나타내면 이런 배열이 생기고 꼬리 잡기 하듯 돌고 돌아 15번째에 15가 있어야 한다.

이런 순서로 순회가 발생해야 한다.

맨 처음에는 5를 찾아가도록 해야 한다.

0xf가 저장되어 있는 위치는 0x402540 + 5 * 4

in[0] == x (x & 15 == 5)

그리고 모든 순회가 끝날떄에 보면 %ecx에는 0 ~ 15까지의 합이 저장되어 있다.

[2021.10.17] 아마 계산하는게 귀찮아서 다 더한다고 생각을 했던 것 같은데 마지막에 15를 두기위해서 인덱스 [1] ~ [15] 까지를 더하면 115가 나온다.
<+98>: cmp $0xf, %edx
<+101>: jne 0x401195 <phase_5+109>

이 부분을 눈여겨 봐야 한다. 모든 반복문이 수행 된 이후에 15를 만나야 폭탄이 터지지 않기 때문에 15를 가지고 있는 인덱스는 가장 마지막에 만나야 한다.

in[1] == 115

phase 5 Done

0개의 댓글