fedora 원정대 core3 gate -> iron_golem

fedora 원정대 core3 gate -> iron_golem

iron_golem, iron_golem.c

문제에 들어가기에 앞서 redhat원정대와 fedora원정대의 환경의 차이점을 알아보자.

[환경 요약]
Stack Dummy : O
Down privileage of bash : O
Random Stack : O
Random Library : X
Random Program Binary Mapped : X
ASCII Armor : O
Non-Executable Stack : O
Non-Executable Heap : O
Stack Carany : X
Stack Smashing Protector : X

fedora에서는 1. 스택의 주소가 랜덤이여서 스택의 주소를 입력으로 넣어주기 힘들고 2. 스택에 실행 권한이 없기 때문에 스택안에 심어논 쉘코드를 실행이 불가하다. 그리고 3. ASCII amor가 걸려있어서(함수주소의 처음에 NULL을 삽입) 함수를 연속적으로 호출 할 수 없다.


코드를 보면 간단해 졌지만 환경에 제약조건이 많이 걸려있기 때문에 bof문제들보다 더 어렵다.

먼저 취약점은 strcpy에서 argv[1]을 버퍼로 복사하는 과정에서 발생한다.
버퍼의 크기가 256이므로 4바이트를 더 넣어 sfp를 덮을 수 있고 추가로 4바이트를 덮어서 ret까지 쉽게 조작 할 수 있다.
스택에 실행 권한이 없기 때문에 쉘을 입력으로 넣어 스택에서 실행하기는 힘들어 보인다. 그래서 쉘을 주는 프로그램을 작성하고 메모리중 고정값인 GOT를 이용해서 fakeEBP를 사용하여 공격 할 것이다. 리눅스는 윈도우에서의 IAT테이블같이 프로세스를 메모리에 로딩시 함수 주소를 얻어오지 않고 함수를 호출할때 plt, got테이블을 거쳐서 함수의 주소를 얻어온다.

쉘을 얻어오는 간단한 프로그램을 작성해본다.


이 함수를 실행하면 프로그램실행한 권한으로 쉘이 떨어진다.

공격은 ret를 execl의 주소로 덮고 execl의 인자로 위의 쉘을 주는 프로그램을 넣어 execl이 쉘을 주는 프로그램을 상승된 권한으로 실행하게되어 쉘을 딸 것이다.

이 공격은 leave, ret을 이용하여 공격을 하는것이다.
leave는 move esp,ebp/pop ebp로 동작하는데 pop ebp를 실행하면 fakeEBP에 의해서 GOT-8을 ebp가 가리키게 된다.(esp는 leave의 pop ebp에 의해서 메인스택의 ret를 가리킨다, 메인스택의 ret를 execl로 덮어 씌울 것이다.) 그리고 ret(pop eip, jmp eip)가 실행 되면서 메인스택의 ret인 execl함수를 콜하게 되고 심볼릭링크로 argv[1]자리에 쉘을 주는 프로그램을 걸어놓아서 쉘을 주는 프로그램이 상승된 권한으로 실행되게 된다.

여기서 주의해야할 점은 프롤로그에 의해서 ebp가 움직이면 심볼릭링크가 걸린 쉘을 주는 프로그램을 제대로 참조 할 수 없게 된다.
그렇기 때문에 execl의 프롤로그의 맨처음인 push ebp다음인 move esp,ebp부터 실행하게 하여 원하는 인자를 제대로 참조 할 수 있도록 해야한다.

got테이블의 주소를 확인한다.


GOT의 주소를 알 수 있다.


GOT의 처음주소엔 0x01이 들어가있고 두번째에는 0x0이 들어가있는 것을 볼 수 있다.
GOT-8을 ebp로 설정해줌으로 고정값인 0x1이 인자로 들어가고 0x1을 심볼릭링크로 쉘을 주는 프로그램과 이어준다. 그렇게되면 execl의 함수가 실행될때 argv[1]을 쉘을 주는 프로그램으로 사용하게 된다.
(ln -s systemf `python -c 'print "\x01"'`)

페이로드는
[버퍼][fakeEBP][execl]
로 구성하고 공격을 시도하면


쉘을 얻을 수 있다.
쉘코드 :
./iron_golem `python -c 'print "A"*264 + "\x10\x96\x04\x08" + "\x23\x57\x7a\x00"'`

0 개의 댓글:

댓글 쓰기