no. 1251056
<+31> read_six_numbers
전까지의 스택 상황이다. 매우 큰 배열? 공간을 뚫어 뒀다.
함수의 이름을 보아 6개의 숫자를 입력 받나 보다.
레지스터를 확인해보니 입력한 6개의 숫자는 $rsp를 기준으로 4바이트 씩 차지하며 저장되어 있다.
<+61> cmp $0x5, %eax
%eax가 작거나 같은 경우에 분기를 한다. in[0] - 1이 %eax에 저장되어 있기 때문에 하나의 조건을 알 수 있다.
<+72> cmp $0x6, $r14d
이 둘을 비교해서 동일한 경우에는 <+111>로 분기를 한다. 그러나 아직은 폭탄이 있는 곳은 아니다.
<+81> movslq %ebx, %rax
부호확장을 하라는 명령어로 현재 %ebx에는 %14d를 가리키고 얘는 1을 가지고 있으니까 %rax는 1을 가지게 될것 같다.
<+87> cmp %eax, 0x0(%rbp)
in[1]과 in[0]를 비교해서 동일하지 않아야 폭탄이 터지지 않도록 분기한다.
하 또 반복문이다.....
5번 돌아야 한다. 돌면서 생각을 해 봐야할 듯 싶다.
그러고 나서는 <+48>로 이동.. 레전드네..
현재 %rax = 6 이미 반복문을 5번 돌았기 때문에.
느낌이 계속 이렇게 반복을 하면서 다시
<+58>
비교를 수행, 위에서 한 번 작성했던 것이기 때문에 그냥 보면 모든 원소는 5보다 6보다 작아야 한다.
암튼 이 반복문이 끝나고 나서,
<+138>에 또 위로 돌아오는 명령이 있는 걸로 보아 이것도 반복문인거 같다.
이 반복문이 끝난 후
<+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중 반복문.