[LOB] assassin -> zombie_assassin
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 26 27 28 29 30 31 32 33 34 | /* The Lord of the BOF : The Fellowship of the BOF - zombie_assassin - FEBP */ #include <stdio.h> #include <stdlib.h> main(int argc, char *argv[]) { char buffer[40]; if(argc < 2){ printf("argv error\n"); exit(0); } if(argv[1][47] == '\xbf') { printf("stack retbayed you!\n"); exit(0); } if(argv[1][47] == '\x40') { printf("library retbayed you, too!!\n"); exit(0); } // strncpy instead of strcpy! strncpy(buffer, argv[1], 48); printf("%s\n", buffer); } | cs |
소스를보면 strncpy로 인자가 48바이트로 제한돼 ret까지밖에 덮지 못한다. 이렇게 스택과 라이브러리를 필터링하고 ret이후로 덮어쓸 수 없을 때 fake ebp 기법을 활용한다
fake ebp란 sfp에 buffer-4의 주소를 덮어 ebp를 버퍼주소로 옮기고 ret에 leave주소를 덮어 함수 에필로그 과정을 한번 더 수행해 sfp를 변조해 만든 가짜 ebp로 esp가 가게 만들어 우회하는 기법이다. buffer-4 인 이유는 leave를 한번 더 수행할 때 pop ebp 과정으로 인해 esp+4가 되기 때문에 버퍼의 시작주소에 맞추기 위함이다
[system()][dummy(or exit())]["/bin/sh"][28byte dummy][buffer-4][leave]
↓ ↓
sfp ret
system()과 /bin/sh 주소구하는 방법 전레벨과 같으므로 생략
buffer-4와 leave의 주소를 구하자
leave : 0x80484df
buffer-4 : 0xbffffa60-4 = 0xbffffa5c
[0x40058ae0][AAAA][0x400fbff9][AAA...AA(28byte)][0xbffffa5c][0x80484df]
페이로드와 Password
'System > LOB' 카테고리의 다른 글
[LOB] succubus -> nightmare (0) | 2015.06.01 |
---|---|
[LOB] zombie_assassin -> succubus (0) | 2015.04.30 |
[LOB] giant -> assassin (0) | 2015.04.14 |
[LOB] bugbear -> giant (2) | 2015.04.14 |
[LOB] darkknight -> bugbear (0) | 2015.04.12 |