-
[HackCTF] Random Key Write-up표튜터와 함께하는 Pwnable/HackCTF Write-up 2019. 4. 22. 18:33
이번 문제는 Random Key이다.
굉장히 많이 삽질하고 고생도 많이했다.ㅠㅠ
이 바이너리는 64bit였으며 NX가 걸려있었다.
프로그램을 실행해보면 아래와 같은 화면이 출력된다.
무언가 Key값을 입력하도록 되어있는데 맞추지 못해서 "Nah..."가 출력되었다.
IDA를 이용해서 소스코드를 보도록하자.
v3는 time함수의 return 값을 받고 있는데 time함수는 null을 넘기면
1970년 1월 1일 0시 이후 부터 현재까지 지난 시간을 '초' 단위로 return해준다.
(time함수에 null이 아닌 인자값을 준다면 인자값까지 흐른 시간이다. )
time 함수가 return한 값을 srand 함수에 넘겨주어서 난수를 초기화 시켜주고 있었다
즉, 현재까지 흐른 시간(초)을 이용하여 난수를 초기화한 뒤 rand 함수로 난수를 생성하고 있다.
바로 이 부분이 이 바이너리에서의 취약점이었다. 그 이유는 우리가
똑같은 난수를 생성할 수 있기 때문이다.
그렇기 때문에 이 문제를 해결하기 위해서는 저것과 같은 방법으로
난수를 생성하면 똑같은 난수를 생성할 수 있게된다.
* Thanks to Py0zz1 & malatto *
나는 C코드를 짜서 Payload에 사용하였다. 파이썬에 ctypes라는게 존재했다.
( 참고 : https://frhyme.github.io/python-lib/read_c_code_in_python/ )
< ra.c >
우리도 시간을 이용하여 난수를 생성한 뒤 생성한 난수를 return하는
함수를 만들어주도록 하자!!
위와 같은 코드를 작성한 뒤 이런식으로 raa.so파일을 생성하였다.
so파일이란 shared object의 약자로 공유 객체 파일을 의미한다.
유닉스 계열에서 쓰일 때 .so파일이며 윈도우 계열일 경우 .dll이다.
(dll : dynamically linked library)
< Payload >
파이썬에서 CDLL을 이용하여 .so파일을 읽어오면 그 안의 함수를
파이썬에서도 사용할 수 있게 된다. 나는 위에서 만들어 놓은
gogo 함수를 사용하여 난수를 생성하였고 생성한 난수 변수에 담아 입력하였더니
FLAG를 볼 수 있었다. 하지만 시간이 바뀜에 따라 난수도
바뀌기 때문에 실패할 경우 여러번 시도하면 성공하게된다.
ctypes라는 좋은 기능을 배우게되었다~
반응형'표튜터와 함께하는 Pwnable > HackCTF Write-up' 카테고리의 다른 글
[HackCTF] ROP Write-up (0) 2019.04.24 [HackCTF] RTL_Core Write-up (0) 2019.04.23 [HackCTF] BOF_PIE Write-up (0) 2019.04.21 [HackCTF] RTL_Wolrd Write-up (0) 2019.04.21 [HackCTF] Offset Write-up (0) 2019.04.19 댓글