BOF redhat 원정대 darkknight -> bugbear
bugbear, bugbear.c
코드를 보면 argv[1]이상이 있어야하고 RET에 덮을 시작주소가 0xbf로 시작하면 안된다.
맨위의 주석문을 보면 RTL을 사용하여 풀라는 것을 알 수 있다. RTL은 Return To Lib로 RET를 라이브러리의 함수로 튀게하여 원하는 행동을 수행하도록 하는 것이다.
우리는 쉘을 얻어야하기 때문에 system함수를 사용 할 수 있다. system 함수의 주소는 gdb에서 얻을 수 있다.
시스템 함수의 주소를 얻었다. c에서 system 함수의 사용을 보면 system("/bin/sh")로 sh를 인자로 받는다는 것을 알 수 있다.
system함수의 주소를 알았으니 /bin/sh의 문자열을 가리키는 주소를 찾아야 한다. 코드를 작성하여 /bin/sh를 가리키는 주소를 찾을 수 있다.
system함수의 주소를 넣으면 그 주소부터 1씩 증가하면서 메모리에서 들어있는 /bin/sh를 찾는다.
argv[1]에는 0x40058ae0가 들어가고 하드코딩된 "/bin/sh"문자열은 0x8000000영역에 들어있다. 0x40058ae0을 1씩 증가하면서 8바이트씩 비교하다 같게되면(/bin/sh를 찾음) /bin/sh를 가리키는 포인터를 출력한다.(라이브러리안에 /bin/sh가 있다)
이제 페이로드를 작성하여 공격하면 쉘을 얻을수 있다.
페이로드는
[버퍼][SFP][ RET ]
[ 버퍼 ][system][dummy(4)][/bin/sh]
구성을 하고 공격하면 system함수가 호출되고 system함수 안의 프롤로그가 실행되고 ebp+4같은 방법으로 /bin/sh를 가리키는 주소를 인자로 사용할 수 있다.(system함수에 인자를 전달하고 콜할 때와 같은 상황이 만들어 진다.)
공격을 하면
쉘을 얻을 수 있다.
쉘코드 :
./bugbear `python -c 'print "A"*44 + "\xe0\x8a\x05\x40" + "AAAA" + "\xf9\xbf\x0f\x40"'`
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 개의 댓글:
댓글 쓰기