딩굴댕굴

[Hackerschool FTZ] level 12 - Stack Buffer Overflow(2)

by jennysgap

BOX


[Hackerschool FTZ] level 12 - Stack Buffer Overflow(2)


소스코드를 보면 level11과 비슷한 문제라는 것을 알 수 있음

차이점 

- level11은 인자값을 받은 것을 복사해서 넣었던(strcpy)거라면

- level12는 gets함수를 이용해서 문자열 입력을 받음 이때 버퍼의 주소가 랜덤하게 변함

※ 환경변수를 이용한 공격 및 랜덤 버퍼를 무한 루프로 공격하는 방법

(공격방법은 level11에서 풀었던 방법과 똑같음)


Password: it is like this



gdb 명령 TIP





입력값이 gets 함수에 들어갔을 때에 메모리 상황을 간단하게 보도록 하겠습니다.

printf( "%s\n", str ); 에 브레이크 포인트를 잡으면 입력된 값이 어디에 저장되었는지 알 수 있음


마지막 printf에 브레이크 포인트를 잡아줌. 그 다음 입력을 했을 때 일어나는 상황들을 보겠습니다.


소문자 a 4개가 들어간 위치에서 부터 108만큼 뺀 값임 그러니

2d0 + 108 = 3d8 (stack frame pointer 의 위치가 됨)

그렇다면 오른쪽 옆(0x42015574)은?  RET의 위치가 됨

왼쪽 옆(0x4200af84 - 0x42130a14)은? 더미의 위치가 됨


※ 정리

(gdb) x/75x $esp

esp는 현재 SPF의 위치를 표시해주는 레지스트리고 거기서 부터 75개(*4를 하면 byte수를 알 수 있음)의 메모리를 보여달라

버퍼의 사이즈를 계산해 보니 0xbfffe2d0 -  0xbfffe3cc 까지가 버퍼의 값이고

그 뒤는 8byte 더미 그 뒤는 4byte SPF 그 뒤는 4byte RET 위치더라

결국 우리가 바꿔야 할 값은 RET임









쉘코드를 버퍼에 직접 입력하는 방법




버퍼에 쉘코드를 입력하여 리턴할 때 버퍼부분으로 점프시키면 쉘을 실행시킬 수 있음

그러나 랜덤하게 주소가 변하기 때문에 잘 안됨

그래서 처음에 NOP(Not Operation)코드를 넣는다! "\x90"*200 (200만큼 NOP 코드가 입력 됨)

그 후 Shellcode를 입력하여 점프시킨다.

NOP코드에 떨궈지면 아무런 실행이 일어나지 않고 쭉 타고가다가 쉘코드를 만나면 쉘코드가 실행이 됨

NOP코드의 적당한 위치값만 적어주면 됨





268 - 45 = 23 

23만큼 넘값을 더 넣어야 함


만약 위처럼 한번에 안떨어지면 무한루프로 돌리기










반응형

블로그의 정보

jennysgap

jennysgap

활동하기