티스토리 뷰

소스 코드 먼저 보고 시작해보죠 !

정말 어마어마한 코드입니다. 스택을 모조리 0으로 초기화시켜버리네요...(RET 빼고서요.)
일단, buffer 보다 높은 주소는 절대 사용할 수 없습니다.
그렇다면 일단 이곳을 보고 오세요... 와... 정말 감탄스럽습니다 !
그래서 그냥 한 번 질러봤습니다.

절대 stdio.h를 포함하지 마세요.
이후에 URL에 나와있는대로 컴파일 옵션을 주어 컴파일 한후, export LD_PRELOAD=./printf.so로 등록합니다.

등록이 완료되었습니다. 먼저 복사한 gole1 을 실행해보겠습니다.

오... 마이 갓... 쉘이 따였습니다 ! 이제 실제 golem에 적용해보죠.

안되네요 ... ? 이유는 바로... setuid가 걸려있어서 그렇습니다.
권한이 바뀌어서 실행되면서 LD_PRELOAD에 등록된 라이브러리가 실행이 안되는 거죠.
그럼 아래의 파일에 대해서는 어떨까요 ?

setuid 비트가 걸려있지 않네요.
그리고 내부적으로 my-pass는 geteuid 함수를 호출해서 해당 유저에게 비밀번호를 알려줍니다.
여기에 setuid를 걸지 못하는 이유는 geteuid 함수를 호출할 때 setuid가 걸린 아이디의 비밀번호를 알려주게 되기 때문이죠.
아래와 같이 코딩해보세요.

코딩 후 LD_PRELOAD에 등록까지 마쳤습니다. 이제 my-pass 또는 /bin/my-pass 명령을 실행해보세요 !

와우 ~ 더 상위의 비밀번호를 알아냈네요 ㅎㅎ.
아무튼 ! LD_PRELOAD는 위와 같이 사용할 수 있습니다. 근데 중요한 것은 이번 문제에서는 위와 같이 사용할 수 없다는 겁니다.
이유는 잘 모르지만(아마 전에 참조했던 stack layout 처럼 원래 구조가 그런거겠죠 ?), LD_PRELOAD 환경변수에 넣었던 값은 스택의 하위 주소에 값이 들어가 있습니다.

위와 같이 아무것도 없는 것을 공유라이브러리에 올리고, 프로그램을 실행해보겠습니다.

소스에 dumpcode를 추가시키고 실행해보니... 과연 스택의 하위 주소에 값이 있네요.
이제 LD_PRELOAD에 들어가는 이름을 쉘코드로 바꾸고 공격해보겠습니다.

dumpcode(1050, 100)으로 수정하고 다시 했습니다. 결과를 보니, 0xbffff69a 부터 쉘코드가 시작하네요.
바로 클리어해보겠습니다.

문제를 풀때는 잘 풀리는데 글을 쓰면서 다시 풀면 왜 잘 안풀릴까요 ?? -_-;;
cup of coffee...


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함