본문 바로가기

Pwnable/pwnable.kr

[pwnable.kr] random 풀이

https://pwnable.kr/play.php

 

https://pwnable.kr/play.php

 

pwnable.kr


다른 문제들과 동일하게 kali 리눅스를 이용해서 접속해주었다.

그림 1

접속해서 ls -l 명령어를 통해 파일 정보를 보았더니 flag, random, random.c 파일이 존재하고, random 파일을 실행시켜보니 어떠한 문자를 입력받고 있다.

 

그림 2

 

그래서 random 파일의 소스코드로 예측되는 random.c 파일을 열어서 확인해보았다.

 

그림 3

 

코드는 생각보다 간단했다.

Rand 함수를 통해 랜덤값을 가지고 와서, 입력받은 key와 xor 한 값이 0xdeadbeef이면 flag를 보여준다고 한다.

 

여기서 rand 함수에 대해서 알아야 한다.

rand 함수는 0~32767 사이의 랜덤한 값을 반환하는 함수인데, 문제는 프로그램이 생성될 때 값이 정해지기 때문에, 프로그램을 계속 실행시키더라도 동일한 값이 나온다는 것이다.

 

그럼 random 값이 정해져있다면 key를 구할 수 있을 것 같다.

 

Gdb를 통해 random 파일의 어셈블리 코드를 확인해보았다.

 

그림 4

 

어셈블리 코드에서 맨 처음으로 호출하는 함수의 이름이 rand@plt 인 것으로 보아, rand 함수와 관련된 함수임을 알 수 있다.

 

그리고 +59번째 줄을 보면 eax와 deadbeef를 비교하는 구문이 있는 것을 확인할 수 있는데, 위의 c 코드에서 본 것과 같이 이때 eax가 key ^ random이라는 것을 알 수 있다.

 

통상적으로 함수의 반환값은 eax에 저장되므로, rand 함수가 끝난 후인 18번째 줄에 브레이크 포인트를 걸면 random에 어떠한 값이 저장되어 있는지 확인할 수 있을 것이라고 생각했다.

 

그림 5

Gdb를 통해 확인해보니, eax에는 0x6b8b4567 이라는 값이 들어있고, 다시 한번 실행했을 때에도 똑 같은 값이 들어있는 것을 확인할 수 있다.

즉, random 값은 0x6b8b4567이 되고,

Key ^ random = 0xdeadbeef 이므로 key = 0xdeadbeef ^ random이라는 식이 성립한다.

 

0xdeadbeef와 0x6b8b4567을 xor 하면 0xb526fb88 이라는 값이 key가 되고,

c코드를 보면 key값을 int형으로 받고 있으므로, 3039230856이 key값이 된다.

 

그림 6

'Pwnable > pwnable.kr' 카테고리의 다른 글

[pwnable.kr] lotto 풀이  (0) 2021.08.18
[pwnable.kr] mistake 풀이  (0) 2021.07.29
[pwnable.kr] leg 풀이  (0) 2021.07.29
[pwnable.kr] collision 풀이  (0) 2021.07.26
[pwnable.kr] fd 풀이  (0) 2021.07.11