다른 문제들과 동일하게 kali 리눅스를 이용해서 접속해주었다.
접속해서 ls -l 명령어를 통해 파일 정보를 보았더니 flag, random, random.c 파일이 존재하고, random 파일을 실행시켜보니 어떠한 문자를 입력받고 있다.
그래서 random 파일의 소스코드로 예측되는 random.c 파일을 열어서 확인해보았다.
코드는 생각보다 간단했다.
Rand 함수를 통해 랜덤값을 가지고 와서, 입력받은 key와 xor 한 값이 0xdeadbeef이면 flag를 보여준다고 한다.
여기서 rand 함수에 대해서 알아야 한다.
rand 함수는 0~32767 사이의 랜덤한 값을 반환하는 함수인데, 문제는 프로그램이 생성될 때 값이 정해지기 때문에, 프로그램을 계속 실행시키더라도 동일한 값이 나온다는 것이다.
그럼 random 값이 정해져있다면 key를 구할 수 있을 것 같다.
Gdb를 통해 random 파일의 어셈블리 코드를 확인해보았다.
어셈블리 코드에서 맨 처음으로 호출하는 함수의 이름이 rand@plt 인 것으로 보아, rand 함수와 관련된 함수임을 알 수 있다.
그리고 +59번째 줄을 보면 eax와 deadbeef를 비교하는 구문이 있는 것을 확인할 수 있는데, 위의 c 코드에서 본 것과 같이 이때 eax가 key ^ random이라는 것을 알 수 있다.
통상적으로 함수의 반환값은 eax에 저장되므로, rand 함수가 끝난 후인 18번째 줄에 브레이크 포인트를 걸면 random에 어떠한 값이 저장되어 있는지 확인할 수 있을 것이라고 생각했다.
Gdb를 통해 확인해보니, eax에는 0x6b8b4567 이라는 값이 들어있고, 다시 한번 실행했을 때에도 똑 같은 값이 들어있는 것을 확인할 수 있다.
즉, random 값은 0x6b8b4567이 되고,
Key ^ random = 0xdeadbeef 이므로 key = 0xdeadbeef ^ random이라는 식이 성립한다.
0xdeadbeef와 0x6b8b4567을 xor 하면 0xb526fb88 이라는 값이 key가 되고,
c코드를 보면 key값을 int형으로 받고 있으므로, 3039230856이 key값이 된다.
'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 |