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"'`
Categories
- programming (17)
- security (46)
- study (22)
- system (35)
Recent 7 Days Popular Posts
-
프로그램은 실행하면서 많은 함수를 호출한다. 함수가 호출되고 호출받은 함수가 실행되려면 레지스터와 스택을 사용해야 한다. 버퍼오버플로우 공격을 공부하면서 호출된 함수가 어떻게 esp (스택을 관리하는 레지스터)를 백업하는지 어떻게 스택을 독립적으로 ...
-
$(HOME)/.gdbinit을 생성하면 gdb가 실행될 때 .gdbinit을 불러옴으로 스크립트를 적용시킬 수 있다. ARM 어셈을 처음다루어 라인바이라인으로 분석해 보기위해 몇 가지 스크립트를 작성하였다. .gdbinit ...
-
UBUNUT SSH 서버에 접속 시도를 하면 로그인이 성공하기 전에 뜨는 배너와 로그인이 성공한 후에 뜨는 메세지가 있다. id, pw를 입력하기 전에 뜨는 배너는 디폴트 값으로 /etc/issue.net 을 읽어온다. issue.net 안...
-
라이브러리 로딩 - ld.so.conf 라이브러리란 무엇인가? 프로그램에서 공통으로 사용할 수 있는 기능을 포함하고 있는 오브젝트 파일이다. 동적 라이브러리란 무엇인가? 프로그램을 컴파일하여 생성되는 바이너리에 포함하지 않고 바이너리가...
-
Calling Convection 함수호출규약 은 함수(subroutine, callee)가 어떻게 인자를 전달받고 결과값을 반환하는지에 대한 로우레벨에서의 규칙이다. 다양하게 구현된 함수호출규약들은 파라미터의 위치, 리턴 값이나 리턴 ...
0 개의 댓글:
댓글 쓰기