바이너리 보안옵션을 살펴보면 뭐시기 너무많이 걸려있다.. 일단 바이너리부터 살펴보자.

살펴봤는데 모든 input은 bss영역에 할당받기때문에 스택오버플로우가날 가능성이 없다.

계속 분석해봤는데 마땅한 방법이 없는것 같아서 포기했는데 대회가 끝난후에 용휘형한테 물어봤는데 알려주셔서 이용해서 풀었다.

bss영역의 구조를 살펴보게 되면

생각해볼수있는데 file을 flag파일을 읽어온후 user_input을 출력해줄때 릭하는 방법을 생각해볼 수 있다.

프로그램 자체가 신기한게 입력값을 get, fgets이런 함수로 받지않고 user_defined된 함수를 사용한다. 함수내에는 read로 한바이트씩 받아온다.

이상한 부분을 발견할 수 있는데 \n를 \r\n으로 치환해주는 것을 알 수 있다.

이걸 통해 leak해올 수 있는데 프로그램을 분석해보면 알겠지만 유사도를 검사해서 출력해주는 프로그램이다. flag를 얻을 수 있는 방법은 다음과 같다.

1. 파일을 ..///////////////////////flag~~ 이런식으로 뒤에 .null을 붙는걸 무시하고 flag파일을 읽어온다.

2. stdin을 통해 받은값을 유사도 검색할때 하나씩 줄어드는 값을 이용해서 플래그를 알아내면 된다.


=================


'CTF > pwn' 카테고리의 다른 글

Ekoparty CTF 2015 Pwn100  (0) 2015.10.25
Ekoparty CTF 2015 Pwn50  (0) 2015.10.25

바이너리를 살펴보게 되면 일단 스트립되어있지 않은것을 알 수 있습니다.

함수목록중에 대놓고 vul이라고 취약점이 있다고 알려주는 함수가 있습니다. 들어가서 확인해보게 되면 이런식으로 dest의 사이즈는 24밖에 되지 않는데 아래코드에서 memcpy로 80바이트나 복사하는것을 볼 수 있습니다. 이 부분에서 버퍼오버플로우가 발생하게됩니다.

하지만 vul함수안에서 약간의 버퍼인증을 거치게 되는데 그부분은 다음과 같습니다.

랜덤적인 수를 이용한것이 아닌 입력값을 가지고 검증을 하기때문에 조작해서 패스시킬 수 있습니다. 그리고 expected_size라고 되어있는 부분은 제가 임의로 변수명을 지은것인데,

다음과 같이 설정을 해준 후에 넘어온 size인자와 비교해서 저 구문을 넘어가야되는데 저 구문또한 마찬가지로 제가 입력가능한 데이터이기 때문에 조작할 수 있습니다.

이 두가지를 모두 pass한후에 간단한 RTLChaining을 통해 문제를 풀 수 있습니다. 바이너리안에 쓸만한 plt가 없기 때문에 puts를 통해 got테이블을 릭해주어야 합니다. 릭을 해도 버퍼링 때문에 데이터가 출력되지 않기때문에 fflush(stdout)이 있는 메인 함수로 다시 점프를 해줘야 됩니다. 구한 함수들의 오프셋으로 원본 libc를 구하고 그 오프셋으로 system함수의 주소와 /bin/sh의 주소를 구합니다.

그리고 다시 vul함수로 들어가게 되는데 먼저 구한 system주소와 libc내의 /bin/sh주소로 점프하게 하면 정상적으로 쉘이 실행됩니다.

'CTF > pwn' 카테고리의 다른 글

Ekoparty CTF 2015 Pwn100  (0) 2015.10.25
Ekoparty CTF 2015 Pwn50  (0) 2015.10.25

+ Recent posts