+16에서 함수의 리턴값이 들어갈 %eax 레지스터가 있는데 여기서 이 test는 and 연산을 하게 됩니다. 그러므로 1일 경우 1을 리턴 합니다. 즉 다시 말하면 string_not_equal 함수에서 1을 리턴을 해야만 jne가 실행이 되지 않게됩니다. 만약 jne가 실행된다면 폭탄이 터지게 되기 때문입니다. 즉 문자열을 비교해서 같다면 1을 출력한다는 것을 알 수 있습니다.string_not_equal를 disas 하게고 비교할 문자열을 찾아서 확인하면 됩니다. rdi는 제가 아무렇게나 입력한 값이고 rsi가 비교하는 문자열일 것입니다. x/s로 출력을 해보았고 답이 나왔습니다.phase_2 disas 하게 된다면 이렇게 나오게 됩니다. 일단 가장 먼저보이는 read_six_number 함수가 눈에 보입니다. 아마 6개의 인자를 읽어 온다는 것 같습니다. 그래서 si 명령어를 통해 들어가서 확인했습니다.read_six_numbers 함수 안에 들어왔습니다. +36번째 줄을 보면 리턴되는 eax 레지스터에 0이 저장됩니다. 그렇다면 그 위에 있는 레지스터를 보면 입력값의 인자를 알 수가 있습니다. 그래서 저는 0x12c4+rip를 ni로 한줄씩 출렸을 했습니다.문자열이 나오다가 입력값의 인자가 6개라는 사실을 알게 되었습니다. 이제 다시 phase_2로 가보면 +30을 보면 cmpl $0x0 ,(%rsp)입니다. 다시 말해서 같지 않다면 explode_bomb 가버립니다. 즉 첫 번째 값은 0 !그 다음 +36을 보면 cmpl 0x1,0x4(%rsp) 위와 비슷한데 %rep+4라 하면두 번째 인자라고 추측해볼 수 있습니다. 그렇다면 두 번째 값은 1 !이제 +66까지 %rbx를 잘 따라오게 되면 +66 mov 0x4(%rbx),%eax +69 add (%rbx),%eax +71 cmp %eax,0x8(%rbx)이 나오게됩니다. 어디서 많이 보았던 구조입니다.