2019. 5. 3. 23:05ㆍSystem Hacking/pwnable.kr
안녕하세요!
오늘은
pwnable.kr random문제를
풀어보도록 하겠습니다!
소스코드는 아래와 같습니다!
문제 제목에서부터
random이라고 명시해놨으니,
random 한 것과 관련이 있는 문제겠죠?
우선 코드를 쭉 보고
어디가 취약한지 분석해보도록 하겠습니다!
맨 위에 random이라는 변수가 선언이 되었구요,
random이라는 변수에 rand( )함수를 이용해서 값을 넣습니다!
(랜덤한 값이겠죠..?)
그 다음에 key 변수를 선언하고 0으로 초기화 합니다!
그다음에 이 key 값에
scanf함수를 통해서 사용자에게 입력을 받아서
key값에 기록합니다!
그리고 이 key에 적힌 값과 random에 적힌 값을
^연산해서 (xor 연산)
0xdeadbeef가 나오면
문제가 풀리게됩니다!
xor연산 : 두 값이 같으면 0을 반환 두 값이 다르면 1을 반환
ex) 1110
+ 0100
1010
근데 일단은 gdb를 이용해서
저희가 어떤 값에이 random이라는 변수에 기록되는지
알아보겠습니다!
rand( )함수가
call되는 부분이
main+13이고
rand( )함수가
일을 다 마치고 나올때
그 반환값을 확인해 보겠습니다!
원래 통상적으로
함수의 반환값은 eax 레지스터에
기록합니다!
그래서 main+18에
breakpoint를 걸고
run을 해보았습니다!
eax에는 0x6b8b4567이라는 값이
들어가있었습니다!
그 다음에
혹시나 해서
한번 더 run을 하여
"과연 이번에도 random한 값이 기록될 것인가?"
를 검증하고자 시도해봤죠
근데 놀랍게도 eax에 담긴 값은
0x6b8b4567
똑같은 값이였습니다!
왜 이러는 걸까요?
코드 외관상으로는 아무런 문제가 없었는데 말이죠!
그래서 구글에서 찾아보니!
(코딩 수업시간 때 경험해 보셨을 수도)
rand()함수는 항상 같이 쓰이는
친구들이 있습니다!
바로 srand( )함수와 time( )함수 입니다
왜 같이 쓰이냐?
rand( ) 함수는
시드 값이 변경이 안되면
항상 같은 결과 값을 도출합니다!
rand( )함수도 하나의 함수이고
정해진 수식이 있을테니
(예를 들면 x+1)
그 수식대로 매번 같은 연산을 하니 말이죠!
시드 값은 그냥 = rand 함수 인자 값이라고
이해하시면 될 것 같아요!
그래서 srand()함수와 time()함수가
필요한 거에요!
srand( )함수를 통해서
시드값을 매번 초기화를 해줄 수 있는데,
이때 매번 바뀌는 시간(time( ))
을 넣어서
rand( )함수가 호출될 때
마다 매번 시드값이 바뀌게 되는 겁니다!
(1) srand(time(NULL)) -> 매번 시드가 초기화됨
(2) rand( ) -> 호출되면 매번 다른 값이 나옴
그런데 이번문제는 (1)의 과정이 없기에
항상 같은 결과만 나오게 되는 것입니다!
따라서 저희는 무엇만 하면 된다?
아래처럼 0xdeadbeef와 0x6b8b4567을
xor 연산하여서
(xor은 이렇게 두 개를 xor해서 나머지 값을 알아낼 수 있음)
key값만 구해주면 되는겁니다 (random값이 고정이니)
근데 왜 굳이 10진수로 바꿨냐?
왜냐하면 코드를 보시면
scanf("%d",&key) 부분!
10진수 %d로 받고있기 때문에
저희도 10진수 형식에 맞춰서
입력해야 하니까요!
그래서 아래와 같이
random 프로그램을 실행시키고!
10진수 값
3039230856을 입력하면!
문제가 풀리게 됩니다!
고생하셨습니다!
'System Hacking > pwnable.kr' 카테고리의 다른 글
pwnable.kr [collision] writeup (0) | 2019.05.02 |
---|---|
pwnable.kr [bof] writeup (0) | 2019.05.01 |
pwnable.kr [fd] writeup (0) | 2019.04.29 |