0x02 Study :)/Pwnable
[pwnable.kr][Toddler] random 문제풀이
eli_ez3r
2018. 8. 14. 15:34
Random
#include <stdio.h> int main(){ unsigned int random; random = rand(); // random value! unsigned int key=0; scanf("%d", &key); if( (key ^ random) == 0xdeadbeef ){ printf("Good!\n"); system("/bin/cat flag"); return 0; } printf("Wrong, maybe you should try 2^32 cases.\n"); return 0; }
rand 함수로 랜덤값을 가져오고 있다. 하지만 컴퓨터에서 랜덤값은 항상 똑같은 패턴으로 생성된다. 그래서 보통 랜덤값을 사용할 때에는 rand 함수로 나온 값에 현재 시간이나 다른 요소들을 포함하여 생성한다.
이 문제에서는 단순히 rand 함수만 사용하기 때문에 랜덤값을 추출할 수 있다.
(gdb) x/x $rbp-4 0x7ffd79059f2c: 0x6b8b4567
rand함수가 실행된 이후에 BP를 걸어 값을 확인해 보면 0x6b8b4567가 나온다.
XOR연산의 특징은 A xor B = C 일때, A xor C = B 라는 특징이 있다.
결론적으로 key값은 0xdeadbeef xor 0x6b8b4567 을 하면 얻어 낼 수 있다.
root@kali:~/BoB7/pwnable/flag# python Python 2.7.15 (default, May 1 2018, 05:55:50) [GCC 7.3.0] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> str1 = 0xdeadbeef >>> str2 = 0x6b8b4567 >>> print str1 ^ str2 3039230856
key값은 3039230856이 된다.
flag : Mommy, I thought libc random is unpredictable...
잘못 된 개념을 서술하였거나, 잘못 풀이된 내용이 있으면 댓글 달아주시면 감사합니다 :) 태클 댓글이나 메일(513.eunice@gmail.com) 환영입니다 !! 😊☺️👍 |