ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Toddler's Bottle] random
    Wargame/pwnable.kr Challenge 2019. 2. 19. 10:29

    → 힌트는 아래와 같다.




    → random.c 소스 파일이다.




    → 코드를 해석해보면, random 변수에 rand() 함수를 통해 얻은 값과 사용자로부터 입력받은 key 값을 서로 XOR 연산하여 0xdeadbeef 라는 값을 생성하면 flag 값을 볼 수 있는 문제이다.


    → 여기서 rand() 함수에 주목할 필요가 있다. rand()를 통해 생성되는 난수는 임의로 생성되는 난수이지만 이는 고정적이기 때문에, 다시 난수를 생성해도 고정된 값이 생성된다. 따라서, rand()의 리턴 값을 미리 알아낸다면 random 이라는 난수에 들어갈 값을 알아낼 수 있다.


    → 다음 난수를 미리 알고 있다면, 미리 입력할 key 값을 xor 연산하여 미리 0xdeadbeef 값으로 맞춘다면 문제는 풀리게 된다.


    → 리눅스 실행 프로그램의 라이브러리 함수를 추적할 수 있는 도구인 ltrace 를 사용한다.




    → rand 함수에서 반환되는 값이 0x6b8b4567 임을 알려준다. 따라서, random 변수에 들어갈 난수 값은 0x6b8b4567 이므로,


    → 0x6b8b4567 ^ 0x???????? == 0xdeadbeef 에 만족하는 0x???????? 값을 찾으면 된다.


    → 계산하기 위해 2진수로 나누면,


    ????     ????     ????     ????     ????     ????     ????     ????

    0110    1011    1000    1011    0100    0101    0110    0111

    -----------------------------------------------------------------------

    1101    1110    1010    1101    1011    1110    1110    1111


    → 이걸 노가다로 계산해도 되지만, 비트간 배타적 논리합(XOR) 연산에 대해 위키백과는 아래와 같이 설명하고 있다.


    (출처: https://ko.wikipedia.org/wiki/%EB%B0%B0%ED%83%80%EC%A0%81_%EB%85%BC%EB%A6%AC%ED%95%A9)


    → 위의 내용을 이해하면 결국, 0x6b8b4567 ^ 0xdeadbeef 을 구하면 값을 구할 수 있다.


    → 파이썬을 이용하여 다음과 같이 계산이 가능하다.



    → 계산한 값을 이용하여 다음과 같이 플래그 값을 구한다.



    'Wargame > pwnable.kr Challenge' 카테고리의 다른 글

    [Toddler's Bottle] flag  (0) 2019.02.14
    [Toddler's Bottle] bof  (0) 2019.01.22
    [Toddlers's Bottle] collision  (0) 2019.01.17
    [Toddlers's Bottle] fd  (0) 2019.01.10

    댓글

Designed by Tistory.