no. 1251056
<+33> sscanf 함수
이전까지의 스택 상황이다. 이번에도 2개의 숫자를 입력받기 위해 레지스터를 할당하는 모습을 볼 수 있다.
<+57> cmp $0xf, %eax
위에서 AND 연산을 한 후의 in[0]를 다시 $0xf와 비교합니다. 이 때 두 숫자가 일치하는 경우에 폭탄이 터집니다. 일치하지 않도록 만들어야 합니다.
<+75> cltq
word 길이의 데이터를 double word로 늘려주는 명령어, 원래의 값을 유지하고 크기를 늘린다고 생각.
<+77> mov 0x402540(,%rax,4), %eax
0x402540 + $rax * 4에 존재하는 값을 %eax로 옮김.
<+89> cmp $0xf, %eax
이 둘을 비교해서 동일하지 않은 경우에는 위의 과정을 계속 반복하게 해서 누적되는 값을 얻습니다.
마지막에 %eax에 저장되어 있는 값은 0x402540(,%rax,4) 즉, 4가 곱해진 값이다 결국 AND 연산을 했을 때 6을 얻어야 한다.
<+98> cmp $0xf, %edx
두 개가 다른 경우에 폭탄이 터진다. 그래서 %rdx를 건드릴 수 있는 곳이 어디일까...
근데 그거도 그거인데 아래의 명령어 주소에서
<+103> cmp 0x4(%rsp), %ecx
둘을 비교해서 둘의 값이 동일해야 한다. 지금까지 in[1]을 한번도 쓰지 않았는데 그게 여기서 나왔다. 이 떄 %ecx는 위의 명령어대로 막 움직이다가 마지막에 15를 저장하게 된다. 이를 보면
<+89> jne [something]
주소를 보게 되면 이다. 여기에서 15번을 돌게 되면 %edx를 15로 만들 수 있다. 그러면 in[0]를 6이 아닌 더 작은 걸 넣어야 하나??
그러니까
배열로 나타내면 이런 배열이 생기고 꼬리 잡기 하듯 돌고 돌아 15번째에 15가 있어야 한다.
이런 순서로 순회가 발생해야 한다.
맨 처음에는 5를 찾아가도록 해야 한다.
그리고 모든 순회가 끝날떄에 보면 %ecx에는 0 ~ 15까지의 합이 저장되어 있다.
[2021.10.17] 아마 계산하는게 귀찮아서 다 더한다고 생각을 했던 것 같은데 마지막에 15를 두기위해서 인덱스 [1] ~ [15] 까지를 더하면 115가 나온다.
<+98>: cmp $0xf, %edx
<+101>: jne 0x401195 <phase_5+109>
이 부분을 눈여겨 봐야 한다. 모든 반복문이 수행 된 이후에 15를 만나야 폭탄이 터지지 않기 때문에 15를 가지고 있는 인덱스는 가장 마지막에 만나야 한다.
phase 5 Done