ssh로 서버에 접속해보았다.
서버에 접속해 ls로 파일을 살펴보니 flag, random, random.c 파일이 있었다.
random 파일을 실행시키고 11111111을 입력해 보니까 번호가 틀렸고, 2^32개의 경우를 시도해 보라고 얘기한다.
cat을 통해서 random.c 파일을 확인해 보았다.
rand() 함수를 이용해서 random 값을 구하는데, time을 이용해서 값을 구하지 않기 때문에 항상 고정된 값이 처음으로 나올 것으로 예상된다.
따라서 해당 값과 xdeadbeef 값을 같게 하면 flag를 읽을 수 있다.
gdb를 통해서 random을 분석했다.
main+18에서 rbp-0x4에 rand()의 값을 저장하는 것을 확인할 수 있다.
main+18에 breakpoint를 설정하고 실행해서 저장된 값을 확인하려 했으나 00000000이 저장되어 있었다.
오잉
그래서 두 숫자를 비교하는 main+59에 breakpoint를 설정하고 비교하는 eax의 값을 확인해보았다.
rand()의 값이 0x6b8b4567인 것을 확인할 수 있다.
따라서 0xdeadbeef^0x6b8b4567를 한 값인 0xB526FB88가 답이다.
정수형으로 입력받기 때문에 3039230856를 입력해주면 된다.
key값을 찾을 수 있었다.
이번에는 직접 넣었지만 익스플로잇 코드로 XOR을 한번 더 실행해도 원래 값을 찾을 수 있었을 것이다. (XOR은 두번 하면 원상복귀니까)