-
[pwnable.kr] Level 6 - randomWargame/pwnable.kr 2023. 4. 9. 11:37반응형
Level 6 - random을 풀어보자.
문제를 보면 프로그래밍에서 어떻게 무작위 값을 사용할 수 있는지 물어보는 것 같다.

<random의 문제 화면> Kali에서 ssh로 해당 문제에 접속을 해보도록 하자.
존재하는 파일들을 보면, flag와 random 파일 그리고 random의 소스 코드가 있다.

<random 문제 접속> 우선 random 파일을 실행해보자.
파일을 실행했을 때, 아무런 변화가 없어 임의의 값 'test'를 입력해보았다.
그랬더니 틀렸다고 나타나며, 2^32 번의 시도를 해야될 수 있다고 알려준다.

<random 파일 실행 결과> 그 정도의 시도를 할 수는 없으므로 파일을 분석해보도록 하자.
먼저 random.c 파일을 확인해보자.
소스 코드를 보면 rand() 함수에 의해 random 값이 주어지고, key 값을 입력한다.
입력하는 값인 key와 random 값을 xor 수행한 결과가 0xdeadbeef 면은 문제가 해결된다.

<random 문제의 소스 파일> gdb를 통해 random 파일의 동작을 분석해보도록 하자.
random 값은 [rbp-0x4]에, key 값은 [rbp-0x8]에 위치한다.
그 외에 이 문제에서 도움이 될만한 부분은 없는 것 같다.
이 문제는 소스 코드를 잘 보면 해결할 수 있다.
c언어에서 random 값을 주는 rand 함수의 경우, 시드가 필요하다.
그것을 위해 srand라는 함수와 time 함수를 사용해야 한다.
프로그래밍 언어를 공부할 때, rand 함수를 사용하기 전에 srand(time(NULL))을 이용한 적이 많았다.
그 때는 이해를 못했지만, rand 함수에 시드를 넣기 위한 것이라는 것을 알게 되었다.

<rand 파일 gdb 분석> 그런데, 이 문제는 rand 함수를 이용하는 것에 있어 어떠한 시드도 넣고 있지 않다.
그 의미는 항상 rand 함수에 의한 값이 같다는 것이다.
break point를 걸고 프로그램을 실행해보면 할 때마다 같은 값이 random 변수에 저장되는 것을 볼 수 있다.
항상 0x6b8b4597이라는 값이 저장되고 있다.
이것을 이용해 문제를 해결해보도록 하자.

<random 변수의 값> xor의 특성으로 양쪽에 random 값을 xor 연산해주도록 하자.
그 결과 입력해야 할 key 값인 3039230856이 나타나는 것을 볼 수 있다.
이제 random 프로그램을 실행시키고, 구한 key 값을 입력하면 flag가 출력된다.

<random의 flag 확인> 반응형'Wargame > pwnable.kr' 카테고리의 다른 글
[pwnable.kr] Level 8 - leg (0) 2023.04.23 [pwnable.kr] Level 7 - input (0) 2023.04.09 [pwnable.kr] Level 5 - passcode (0) 2023.04.01 [pwnable.kr] Level 4 - flag (0) 2023.02.05 [pwnable.kr] Level 3 - bof (0) 2023.01.07