BOF redhat 원정대 darkknight -> bugbear

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"'`

0 개의 댓글:

댓글 쓰기