.

해당 ssh를 이용해 포너블로 접속해주었다.

어떤 파일이 있는지 확인하기 위해 ls -l 명령어를 통해 현재 파일들을 확인해보았다.
flag 파일의 id가 random이기 때문에 이를 볼 수 있는 권한이 없는 상태이다.
random이라는 실행파일이 존재하고, setuid가 random_pwn권한으로 되어있다.
random elf로 random_pwn의 권한으로 flag의 내용을 볼 수 있을 것 같다.
여기서 elf란
Executable and Linkable Format, 또는 ELF. ELF는 유닉스 계열 운영체제의 실행, 오브젝트 파일, 공유 라이브러리, 또는 코어 덤프를 할 수 있게 하는 바이너리 파일이다. 간단히, 실행 파일이다. 원래 뜻은 Extensible Linking Format 이라는 뜻을 가지고 있었다.

random.c의 내용을 분석해보자.
unsigned int형 지역변수 random을 선언했고, rand()함수를 통해 난수를 생성하여 random 변수에 저장한다.
key^random == 0xdeadbeef이면 flag를 보여주고 종료한다.
그 후, Wrong~을 출력한다.
난수 생성 함수는 srand()와 rand()가 있는데 srand()는 seed 설정이 가능하지만 rand()는 seed 설정이 불가능하다.

이제 중요한 부분이다.
key ^ random == 0xdeadbeef를 보면, 같은 비트를 xor 연산을 두번해줄 경우, 그 연산이 사라진다.

random 변수의 위치를 찾기 위해 main+18에 breakpoint를 걸어준다.
rand 함수를 거친뒤의 random 변수를 가리키기 때문이다.
이후에, 디버그 작업을 진행해준다.
아래의 0x6b8b4567 값을 10진수로 변환해준다.

key == 0xdeadbeef ^ random
key == 3039230856

flag 값이 나타났다!!
'CTF 스터디' 카테고리의 다른 글
[pwnable.kr] 8번_ leg 풀이 (0) | 2021.04.23 |
---|---|
[pwnable.kr] 7번_input 풀이 (0) | 2021.04.05 |
[pwnable.kr] 5번_ passcode 풀이 (0) | 2021.03.31 |
[pwnable.kr] 4번_ flag 풀이 (0) | 2021.03.30 |
[pwnable.kr] 3번_bof 풀이 (0) | 2021.03.23 |