/*
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(b , src, 41);
printf("%s\n", buffer);
}
main(int argc, char *argv[])
{
if(argc<2){
printf("argv error\n");
exit(0);
}
problem_child(argv[1]);
}
FPO, Frame Pointer Overflow 힌트이다.
FPO 대한 설명은 아래 링크를 확인하자!
https://dokhakdubini.tistory.com/228?category=809542
진짜 상세히 설명이 되어있어 이것만 보면 이해가 될 것이다. (정리가 짱짱!)
바로 payload를 짜보자!
payload = shellcode 주소+ nop + shellcode + \x?? = 총 41byte이다.
우선 buffer 변수 주소를 찾아보자!
빨간색 -> problem_child 함수 leave 명령어 수행 후 ebp가 가리켜야하는 주소
노란색 -> main 함수 leave 명령어 수행 후 esp가 가리켜야하는 주소, 값으로는 파란색 주소가 들어가야한다.
파란색 -> main 함수 ret 명령 수행 후 eip가 가리켜야하는 주소, 값으로는 shellcode가 들어가야한다.
위에 payload에서 \x?? 에 들어가야하는값은 b0 이다. -> 0xbffffab0 으로 점프하기 위해
성공!
FPO 개념은 기억하자 꽤나 재밌다 ㅎㅎ