티스토리 뷰
level13으로 로그인을 하여 힌트를 우선 읽어보자.
본 문제는 스택가드에 관련된 문제이다.
스택가드는 버퍼 오버플로우를 방지하기 위한 방어 방법의 하나로, 레벨12의 문제를 예로 들어보자.
buffer(256bytes) + dummy(8bytes) + SFP(4bytes) + RET(4bytes)를 덮어 씌워 버퍼 오버 플로우를 일으키는 공격이었다. 하지만 여기에 스택가드를 추가하여
buffer(256bytes) + stackguard(4bytes) + dummy(8bytes) + SFP(4bytes) + RET(4bytes)로 구성하게 되었을 때
이미 저장되어있는 스택가드에 대하여 값이 변동이 있다면 버퍼 오버플로우가 발생했다는 것을 쉽게 감지할 수 있으므로 버퍼 오버플로우에 대해 방어를 할 수 있게 된다.
이에 대한 공격 방법으로는 스택가드의 값과 메모리 주소를 사전에 정확하게 안 뒤에 해당위치의 값은 변동을 주지 않고 유지한 상태로 RET주소를 변동해주는 것이 가장 큰 목표이다.
다음 문제는 버퍼의 크기가 1024이다.
gdb로 디스어셈블링한 코드를 한번 살펴보자.
우선 esp가 0x418 (1048)만큼 차지하고 있는 것을 알 수 있는데 어딘가에 더미가 쌓여 있음을 추측할 수 있다. 실행을 할 수 있어야 하지만 현재 구축된 로컬 서버에서는 에러가 발생하여 gdb를 정상적으로 수행할 수 없게되었다. 하지만 i 의 값이 정해져 있기때문에 esp에 대해서 분석을 해본다면 쉽게 알 수 있을 것이다.
이를 추론하여 공격 방법으로는
./attackme `python -c 'print "shellcode"+"A"*[i변수 직전까지]+"\x67\x45\x23\x01'+"A"*[RET까지]+"[buf의 시작주소]"'`
라는 방식으로 공격을 하면 해결할 수 있다.
'[Hackerschool] F.T.Z' 카테고리의 다른 글
해커스쿨 - level15 (0) | 2017.11.16 |
---|---|
해커스쿨 - level14 (0) | 2017.11.16 |
해커스쿨 - level12 (0) | 2017.11.15 |
해커스쿨 - level11 (2) | 2017.11.06 |
해커스쿨 - level10 (0) | 2017.11.06 |