코드를 살펴보면 fgets에서 79로 입력 사이즈를 제한 함으로 버퍼오버플로우 로는 접근할 수 없다.
printf
를 살펴보면 형식 지정자 없이 사용함으로 pritnf("%s", bleh);
처럼 동작 될것을 예상 할 수 있다.
위와 같이 형식 지정자를 이용해서 프로그램을 실행 시켜보면 %x 3번째 이후 AAAA의 값이 출력되는 것을 알 수 있다.
이와같이 Format String Bug를 이용하여 level21 계정에 접근하면 되겠다.
return 주소를 확인하기 위해 gdb로 main 함수를 disassembler 하려 했으나, 아래와 같이 접근이 막혀 있었다.
이때 사용할 수 있는 것은 .dotrs
의 주소 값이다.
gcc 컴파일러는 컴파일 중에 .ctors
와 .dtors
두 세그먼트를 생성한다.
.ctors는 main 함수 전에 실행되고 .dtors는 main 함수 종료 후에 실행된다.
아래와 같이 readelf
명령을 사용하여 .dtors
의 주소를 확인한다.
아래와 같이 export
명령을 사용해 환경변수에 41byte shellcode를 등록한다.
아래와 같이 환경변수 shellcode 주소 확인 코드를 작성하고 주소를 확인한다.
페이로드는 위와 같은 구조로 작성 할것이고 부분적으로 설명하자면 %x 3개는 위에서 테스트한 바와 같이 %x 3개 뒤부터 AAAA에 접근 할 수 있기때문에 넣은것이다.
.dtors
주소값 0x08049594
에서 4byte 더한 주소에 Shellcode를 넣어 실행하면 되는데, shellcode 주소 값인 0xbffffc14 = 3221224468
과 같이 큰값은 x86 pc에서 처리 할 수 없음으로 4byte씩 쪼개서 처리해 준다.
%1234c
와 같이 공백을 사용하여 %n으로 입력받는 값으로 sellcode 주소를 전달하는 방식으로 한다.
4 + 4 + 4 + 4 + 8 + 8 + 8 = 16 + 24 = 40
0xfc14 = 64532 - 40 = 64492
0xbfff = 49151 = (0x1bfff)114687 - 64492 = 50195 - 40 = 50155
[Fedora] 메모리 보호 기법 확인 (0) | 2020.05.08 |
---|---|
[ftz] hacker school level19 풀이 (0) | 2020.04.28 |
[ftz] hacker school level18 풀이 (0) | 2020.04.28 |
[ftz] hcaker school level17 풀이 (0) | 2020.04.28 |
[ftz] hacker school level16 풀이 (0) | 2020.04.28 |