[pwnable.kr] Toddler’s Bottle – random
코드는 이렇습니다.
rand 함수는 난수를 생성하는 함수입니다. rand 함수는 seed표의 값에 따라 발생하는 난수의 값이 달라지는데, srand 함수로 seed 값을 정해줄 수 있습니다.
seed 값이 다르다면 rand 함수에서 발생시키는 난수 또한 달라지게 됩니다. 그래서 시간 값을 매개로 초기화하게 되면 불규칙적인 난수를 생성하게 됩니다. 하지만 위의 코드에서는 seed 값을 주지 않았기 때문에 매 프로그램 실행 시마다 같은 난수를 얻게 됩니다.
동일한 seed표에서 값을 참조했기 때문이죠.
즉, 랜덤이 아니라는 것입니다.
그럼 gdb에 올려서 random값을 확인한 다음에 random 값과 0xdeadbeef를 xor 한 결과를 10진수로 넣어주면 되겠네요.
rand 함수의 return 값이 rbp-0x4에 할당되는 모습과 rbp-0x8을 0으로 초기화하는 걸 봤을 때, rbp-0x4는 random 변수, rbp-0x8은 key라는 것을 알 수 있습니다.
여기가 xor 하는 부분인데, *main+56에 break point를 걸고, random과 key 변수에 어떤 값이 들어가 있는 지 확인해봅시다.
(scanf에 전달한 값은 0x11111111의 10진수입니다.)
두 변수의 정확한 위치를 알았고, 저 둘을 xor해서 deadbeef가 나오면 됩니다.
random값과 0xdeadbeef를 xor 해보면,
이 값을 scanf에 전달하면 됩니다.
flag가 출력됩니다.
'System&Write up > Pwnable.kr' 카테고리의 다른 글
[pwnable.kr] Toddler's Bottle - lotto (1) | 2017.12.15 |
---|---|
[pwnable.kr] Toddler's Bottle - blackjack (0) | 2017.12.15 |
[pwnable.kr] Toddler's Bottle - passcode (0) | 2017.11.24 |
[pwnable.kr] Toddler's Bottle - flag (0) | 2017.11.23 |
[pwnable.kr] Toddler's Bottle - bof (0) | 2017.11.22 |