pwnable.kr [random] writeup

2019. 5. 3. 23:05System 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