profile image

L o a d i n g . . .

article thumbnail image
Published 2021. 3. 21. 20:45

1. 문제

문제에 걸려있는 보호기법들이다.

NX 만 걸려있어 RTL 문제임을 알 수 있다.

 

파일을 실행시킨 모습이다.

주소를 10진수 형태로 입력하면 그 주소의 내용을 출력해준다.

만약 이중 포인터 값을 넣어주면 또 다시 주소를 출력할 것이다. 여기서 뭔가 leak이 될 것 같은 강한 예감이 든다..!

그리고 메시지를 입력하라고 하고 입력한 메시지를 출력해주는 형태이다.

 

 

이번엔 ida로 파일을 열어보았다.

처음에 주소를 10진수 형태로 입력받고, 16진수로 변환해준 다음 이중포인터인 v8에 저장한다.

그리고 v8을 인자로 하는 See_something 함수가 실행된다.

 

See_something 함수이다.

입력받은 주소의 내용을 %p 형태로 출력한다.

 

 

Print_message 함수이다.

여기서 bof 취약점이 발생한다.

dest 버퍼의 크기는 56 byte 지만, 256 byte 짜리 src를 dest에 복사할 때 입력값 검증을 하지 않기 때문이다.

따라서 bof를 일으켜 ret 값을 실행 가능한 라이브러리 함수인 "system" 함수의 주소로 덮고, RET를 주고, system 함수의 인자로 "/bin/sh"의 주소를 주면 쉘을 얻을 수 있을 것이다.

 

다만, 이때 ASLR이 적용되어 있음을 고려할 때 라이브러리 함수의 주소를 하나 leak 해서 그것을 통해 libc base address를 얻고, 위에서 필요로 하는 함수들의 offset들을 구해서 문제를 해결할 수 있을 것이다.

-> Lazenca x86 RTL에서 했던 익스코드와 상당히 유사할 것으로 보인다.

 

 

 

2. 문제 해결 과정

 

Print_message 함수의 스택 프레임이다.

RET 전까지 즉, 60 byte 만큼을 dummy 값으로 채우고 RET에 system 함수의 주소를, 그 뒤에 return address를, 그리고 뒤에 "/bin/sh" 주소를 넣어주면 될 듯하다.

 

 

system offset

 

binsh offset

 

printf offset

 

 

 

3. Exploit

위의 논리대로 exploit code를 짜보았다.

aslr이 걸려있기에 leak 된 printf 주소로 libcbase 주소를 구했다.

그리고 system 함수와 "/bin/sh" offset들을 libcbase에 더해서 system 함수 주소와 "/bin/sh" 주소를 구해 RTL 기법을 이용하였다!

 

 

성공적으로 쉘을 획득한 모습이다!!

ASLR과 NX 보호 기법이 걸려있는 상황에서 RTL 을 통해 익스하는 문제였다!

복사했습니다!