ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Toddler's Bottle] random write-up
    System hacking training/pwnable.kr 2018. 7. 21. 20:50

    pwnable.kr Toddler's Bottle 6번째 문제 random 을 풀이하였습니다.

    아버님이 프로그래밍을 할때 random 값을 어떻게 사용하는지 가르쳐줬다고 하는것으로 보아 난수에 대한 문제로 추정을 했습니다. 그리고 ssh로 바로 접속을 하였고 바이너리의 소스 코드를 확인해보면 다음과 같습니다.

    rand()를 사용하여 난수를 생성하고 key값을 사용자로 부터 입력받아 xor 연산 후 0xdeadbeef와 같다면 쉘을 띄워줍니다. 만약 다르다면 2의 32제곱의 경우의 수를 생각해야될것이라고 언지를 해주면서 프로그램이 종료됩니다. rand()로 난수를 생성하는 것은 어쩌면 상관없을 것 같지만 이와 같이 key값을 인증하는곳에 쓰인다면 문제가 될 수 있습니다. 왜냐..!

    저도 처음 알게된 사실이지만 이 처럼 바이너리의 소스코드와 비슷하게 프로그램 하나를 만들어서 출력을 해보았습니다.

    간단하게 설명해보자면 random 이라는 변수에 들어간 값 즉 rand()의 return 값과 사용자로 부터 입력받은 값 (key)을 xor 연산 후 출력을 해주었고, 각 값이 어떤지 값을 확인하기 위해 값을 출력해주었습니다.

    여튼 이 프로그램을 컴파일 후 실행을 해보면 다음과 같은 문제점을 볼 수 있는데요.

    문제점이 보이나요?

    random 과 key 값을 xor 연산한 결과는 다르지만 random에 들어간 값은 항상 같은 것을 알 수 있습니다. 이는 곧 위의 바이너리에서 취약점이 될 수 있죠.

    또 한 가지. scanf("%d")로 입력 받은 key값이 hex값으로 넣었을때 0으로 출력되는 사실도 잊고 있었지만 이 문제를 풀이할 때 조금은 중요한 점을 알 수 있었습니다. 이제 이 바이너리를 gdb로 뜯어보면서 key값을 찾으면 되는데요.

    이렇게 rbp - 0x4의 위치에 unsigned int random 이 위치하며, 이 곳의 값을 출력했을때 0x6b8b4567입니다. 이 값과 0xdeadbeef와 xor 연산을 하면 key값이 되어야 하는 값이 아래와 같이 나옵니다.

    이제 이 값을 10진수로 변환하여 input해주면 flag가 출력됩니다~!

    반응형
Designed by Tistory.