ipwn
[pwnable.kr] random 본문
이번 문제는 random문제이다. 글은 딱히 읽어볼 필요 없는 것 같다.
서버에 접속해보자.
코드를 보니 rand함수로 random변수에 값을 넣어주고 그 값과 우리가 입력해준 key값을 xor한 값이 0xdeadbeef와
같을 경우에 flag를 읽어와준다. 그리고 같지 않을 경우에 2의 32제곱의 케이스만큼 시도해야할 것이라고 우리에게 말한다.
하지만 이 코드에는 결함이 있다. 바로 srand함수가 없다는 것인데, 이 srand함수로 seed 값을 정해줄 수 있다.
이 seed값에 따라 rand 함수를 실행해서 나온 값이 달라진다. 그래서 이 srand함수로 seed값을 time으로 넣어준다면
시간이 경과할 때 마다 seed값이 달라지므로 실행할 경우 계속해서 결과값이 달라진다. 즉 srand 함수가 없다면 rand 함수를
실행시켜도 처음 실행 이후에는 여러번 프로그램을 실행 종료를 반복해도 결국 같은 값이 들어간다는 것이다.
그러므로 이 프로그램에서 random변수에 들어간 값만 알아내면 간단히 클리어 할 수 있는 문제이다.
첫 번째 밑줄 친 부분을 보면 rand의 return값이 rbp-0x4에 들어가는 것을 확인할 수 있고, 두 번째 밑줄 친 부분을 보면
rbp-0x8 부분에 0을 대입하는 것을 보아 key값이라는 것을 유추해 낼 수 있다. 즉 main+21 부분에 break point를 걸어주고
rbp-0x4의 값을 확인, 그 값과 0xdeadbeef를 xor한 값이 key값에 넣어줄 값이 되겠다.
random의 값은 0x6b8b4567이라는 것을 알아냈다.
이제 0x6b8b4567과 0xdeadbeef을 xor한 값을 구하면 된다.
xor한 값은 3039230856이다. 정말 flag가 읽어와지는지 한 번 확인해보자.
성공적으로 flag를 구했다.
'Write up > Pwnable.kr' 카테고리의 다른 글
[pwnable.kr] lotto (0) | 2018.01.03 |
---|---|
[pwnable.kr] blackjack (0) | 2018.01.03 |
[pwnable.kr] passcode (0) | 2018.01.01 |
[pwnable.kr] flag (0) | 2017.12.31 |
[pwnable.kr] bof (0) | 2017.12.31 |