[Hackerschool FTZ] level 12 - Stack Buffer Overflow(2)
by jennysgap[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만큼 넘값을 더 넣어야 함
만약 위처럼 한번에 안떨어지면 무한루프로 돌리기
'BOX' 카테고리의 다른 글
[webhacking.kr] 홈페이지 가입하기 (0) | 2017.12.22 |
---|---|
[Hackerschool FTZ] level 13 - Stack Guard (0) | 2017.12.20 |
[Hackerschool FTZ] level 11 - Stack Buffer Overflow (0) | 2017.12.13 |
[Hackerschool FTZ] level 10 - 공유메모리 read/write (0) | 2017.12.12 |
[Hackerschool FTZ] level 9 - 버퍼 오버플로우 (0) | 2017.12.12 |
블로그의 정보
jennysgap
jennysgap