BOF redhat 원정대 bugbear -> gaint

BOF redhat 원정대 bugbear -> gaint

gaint, gaint.c


코드를 보면 argv를 받고 라이브러리 주소와 함수의 오프셋값을 이용해서 execve함수의 주소값을 저장해 놓는다. 그리고 argv에서 44번째부터 4개가 execve함수의 주소가 맞는지 검사를 한다.
입력값에 execve함수의 주소만 맞추어 프로그램 종료 루틴으로 들어가지만 않게 되면 이전 문제에서 사용하였던 오메가 공격을 할 수 있다.
gdb로 execve 함수의 주소를 찾아보자.


execve, system함수의 주소를 찾았다. execve 함수를 사용하여 쉘을 실행하기엔 함수가 사용자 친화적이지 않기때문에 해줘야할 것이 많다. 그래서 system함수를 사용하여 쉘을 얻는 것이 쉽다.
페이로드는
[버퍼][SFP][RET]
[    놉   ][execve][system][AAAA][bin/sh]
로 구성하고 공격을 수행하면


쉘을 얻을 수 있다.
쉘코드 :
./giant "`python -c 'print "A"*44 + "\x48\x9d\x0a\x40" + "\xe0\x8a\x05\x40" + "AAAA" + "\xf9\xbf\x0f\x40"'`"

댓글 1개:

  1. 환경변수 path에 /bin이 추가되있음에도 불구하고 execve() 함수의인자로 절대경로인 /bin/sh를 주는 이유는 execve()함수의 특성. system()는 sh만 인자로 줘도 실행된다.

    답글삭제