[LOB] golem -> darkknight
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | /* 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]); } | cs |
먼저 함수의 프롤로그와 에필로그 글을 보고 오자
darkknight 소스를 보면
주석에 FPO라고 쓰여져있는데 이는 Frame Pointer Overflow의 약자로 함수 에필로그 과정에서 함수를 종료하면서 ebp포인터를 복구시킬 때 공격자가 원하는곳으로 ebp를 이동시켜 공격코드를 실행시키는 기법이다.
strncpy함수를 쓰는데 41바이트제한으로 딱 1바이트 오버플로우를 시킬 수 있다. sfp(saved frame pointer) 영역의 마지막 1바이트를 변조시킬 수 있다. 겨우 1바이트로 뭘하지 할텐데
우선 sfp에 저장되어있는 값을 보자
버퍼크기만큼 채운 NOP바로 뒤 sfp에 0xbffffa00값이 들어있다.
버퍼의 시작주소가 담겨있는 주소 역시 0xbffffaa0로 앞의 3바이트가 같으므로 1바이트 변조로도 ebp를 버퍼로 이동시킬 수 있다.
? 세폴이 뜬다. core를 떨어트려 분석해보자
역시 주소가 바뀌어있다. 80으로 바꿔서 해보자
세폴이뜬다.
problem_child에서 sfp를 변조하면 ebp는 0xbffffa80으로 날아간다. 그리고 main으로 돌아가서 나머지들을 실행한 후
main의 leave 과정을 통해 mov esp, ebp 명령어를 실행 할 때 esp가 0xbffffa80으로 날아가게 된다
leave과정중 pop ebp를 하게 되면 esp값이 +4가 된다.
그상태에서 ret과정을 통해 pop eip와 jmp eip, 결과적으로 0xbffffa80(esp)+4의 주소에 있는 값이 eip에 들어가고 그 값으로 jmp(점프)하게 되어서 0x90909090 주소로 점프해버려 쉘코드 실행이 되지 않는것이다,
주소를 -4하면 해결된다
\x80->\x7c
페이로드와 Password
'System > LOB' 카테고리의 다른 글
[LOB] bugbear -> giant (2) | 2015.04.14 |
---|---|
[LOB] darkknight -> bugbear (0) | 2015.04.12 |
함수의 프롤로그(prologue) 및 에필로그(epilogue) (0) | 2015.04.10 |
[LOB] skeleton -> golem (0) | 2015.04.07 |
[LOB] vampire -> skeleton (0) | 2015.04.01 |