티스토리 뷰

매우 간단한 문제입니다.

그 대신 이제 ASLR, Ascii-Armor, NX-Bit 가 걸려있어서 쉘코드를 실행시키기도 어렵고, 공유라이브러리 함수를 연결시켜서 수행하기도 힘듭니다.

그 대신 정말 참신한 방법이 존재합니다. 바로, execl+3 의 주소를 이용하는 겁니다.

이 글 읽는 분들이라면 아마 스택이 어떤식으로 만들어지고, 인자를 어떻게 참조하는지 아실겁니다. 그래도 간단히 보죠.

| buf(264) | ebp(4) | ret(4) | 인자1 | 인자2 | -> 이와 같은 식으로 구성됩니다.

위와 같이 구성되는 이유는 함수의 프롤로그 때문인데요. 함수가 처음 수행될 때 아래와 같이 수행됩니다.

익숙하시죠 ? push ebp; mov ebp, esp -> 이 과정을 거침으로써 위의 기본 스택 구조가,

| ebp(4) | ret(execl 함수) | new ret(4) | 인자1 | 인자2 | 인자3 | -> 이렇게 변하는 것이죠.

만일 위의 구조가 왜 그런 것인지 이해가 잘 안되신다면 Redhat 6.2(LOB)를 다시 한 번 푸시는 것이 더 도움이 되실 겁니다.

아니면, 이곳에서 공부하시면 될겁니다 ㅎㅎ...

아무튼, 함수의 프롤로그가 수행되면서 인자를 참조하는 위치가 바뀌는 것입니다.

그렇다면, execl+3의 주소를 ret에 넣어주고 ebp에 원하는 인자의 주소-8 의 위치를 넣어주면 스택은 아래와 같이 적용됩니다.

| buf(264) | ebp(0x12345678) | ret(execl+3) | 인자1 | 인자2 | 인자3 |

왜냐하면, execl의 프롤로그를 생략했기때문에 0x12345678을 기준으로 인자를 참조하게 되기 때문이죠 !

이해되시나요 ?(정말 신기하죠 ?!?!?)


그럼 이제 ASLR이 적용되지 않는 부분을 인자로 전달하면서 execl을 수행할 수 있는 곳을 살펴보겠습니다.

전 got 영역을 이용하겠습니다.

ebp를 0x08049610으로 주게되면, 첫 번째 인자를 0x08049618 부터 참조하게 되니, 저희는 \x01 값을 링크시켜주면 됩니다.

링크시켜 줄 파일은 다음과 같이 작성했습니다.

바로 링크걸고 공격해보겠습니다.

blood on the fedora...

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함