no. 1251056
음.. 이런게 있는 줄 몰랐다. 친구가 생일 축하 연락하다가 얘기가 나와서 가르쳐 주고 떠남.. 진짜 폭탄을 던져버림
그 시크릿 페이즈로 가려면 4페이즈에서의 입력이 바껴야 한다.
물론 정답은 두고 바껴야 한다.
마지막 페이즈까지 입력을 받은후에 이전에 입력 받았던 값을 다시 가져와서 확인하니
이를 위한 입력은 원래의 입력 도중에 트리거가 있다.disas phase_defused를 확인하면서 <+62>쪽의 메모리 값을 확인해보면 될 것 같다.
여기서 시크릿 페이즈의 입력 값을 받아옴 $rax를 확인 해보니 입력한 "문자열"이 저장되어 있었음.
이전의 스택 현황이고, strtol?? 처음 보는 함수라 검색해보고 오겠음.
str 관련 함수
strtol : 문자열을 long 값으로 변환 합니다. 2진수, 8진수, 16진수 값을 10진수로 변환 합니다. (string to long)
strtol의 형태
long strtol(const char* , char** , int );
인자의 종류를 알 수 있는데 $rdi에는 char*, $esi에는 0 == NULL, $edx에는 10 즉 기수로 10진수가 들어간다.
옳은 행동을 하지 않은 경우에는 0을 리턴하는 것도 알아두도록 하자.
일단 현재 입력된 값이 "i r"인데 어떻게 변환되는지 보도록 하겠음.
문자가 들어가니 0을 리턴했다.
생각해보니 문자열을 long형태로 변환하는 건데 당연히 숫자가 들어가야 할거 같다.
일단 strtol의 리턴값 - 1 한 것이 1000보다 같거나 커야 한다.
fun7 함수에 들어가기 전에 함수의 인자로 입력한 숫자, 그리고 메모리 주소를 넘긴다.
노드 1 ~ 6이 존재하고, n[level][sibling] 이라고 봐야 할지 개수가 왠지는 모르겠지만 그러해 보인다.
마치 트리를 가지고 있는 듯하다.
그리고 n1기준으로 [1], [2] 를 보면 왼쪽, 오른쪽 자식을 찾아가는 것을 확인 할 수 있다.
입력 받은 노드의 주소를 비교해서 0, 0인지 확인을 한다. 이 경우에 -1을 리턴해서 폭탄이 터진다.
%edx에다가 현재 노드의 value를 저장한 후에 본인이 입력한 값과 비교해 노드의 값이 작거나 같은 경우 점프 한다.
리턴으로 0을 넣은 후에 노드이 value와 입력값이 동일한 경우 리턴하도록 한다.
원하는 정답은 1을 리턴하는 것이기 때문에 루트 노드를 원하는 것이 아니였다.
왼쪽 자식,
리턴 값을 2 * eax 한다면 1이 나올 가능성이 없으니까 왼쪽을 찾는 것은 의미가 없어 보인다.
오른쪽 자식,
secret DONE!!!!!!!!!!!!