감자 텃밭

[HackCTF] random 본문

my_study/HackCTF

[HackCTF] random

g2h 2021. 8. 9. 22:42

이번에 풀어볼 문제는 hackctf의 random문제이다 이번 문제는 접근 방식이 생소하여 검색을 통해 새로운 것들을 많이 알게 된 문제이다

일단 해당 문제를 실행시켜보았다.

해당 프로그램을 실행시켰을때 특정한 값들이 랜덤적으로 나오는 것을 확인할 수 있었다(난수)

또한 해당 프로그램의 적용된 메모리 보호 기법을 확인하였다

역시 NX가 걸려있는걸로 보아 쉘 코드는 실행이 불가능해 보였다

IDA를 통해 좀 더 상세히 분석을 해보았다.

V3변수에 time(0ll) 즉 null값을 넣고 srand함수의 인자 값으로 v3를 넣었다 time함수에 널값을 넣게 되면 1970년 1월 1일 0시 이후부터 현제까지의 시간이 초로 변환되어 저장된다. 그리고 srand함수는 rand함수를 사용할 때 시드 값을 설정해주는 함수이다. seed값을 바탕으로 rand의 난수 값이 변경된다. 그 후 v5함수에 rand함수를 통해 난수를 입력한다

최종적으로 if문에서 v5와 우리가 입력하는 v4의 값이 같으면 플래그를 획득할 수 있는 방식인 거 같다.

여기서 해결법은 생각보다 단순했다

이번 풀이는 다른 풀이와 다르게 nc로 서버에 접근해야하는 방식이었다.

서버의 시드값으로 설정된 rand난수 값과 우리가 입력하는 값을 같게 해 주면 된다. 여기서 어떻게 같아지는 거지?라고 생각했지만 역시나 단순했다 해당 문제의 시드 값으로는 time함수를 통해 현제까지의 시간을 시드 값으로 넣고 있었다

그럼 나도 같이 현제까지의 시간을 시드값으로 주면 된다.

c언어로 현재 시간까지의 초를 구해 시드값으로 주고 똑같이 rand함수를 통해 난수를 생성하는 코드를 만들었다.

그 후 해당 서버의 시간(시드값)과 나의 값이 동일해야 하므로

nc로 접근할떄 | (파이프라인)을 사용하여 접근하였더니 성공적으로 문제를 해결할 수 있었다.

해당 문제는 굉장히 신선하면서도 재미있었던 거 같다 

'my_study > HackCTF' 카테고리의 다른 글

[HackCTF] Look at me  (0) 2021.08.16
[HackCTF] Beginner_Heap  (0) 2021.08.10
[HackCTF] 1996  (0) 2021.08.09
[HackCTF] Poet  (0) 2021.08.09
g++ pwn  (0) 2021.07.23