/*
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]);
}
이 문제는 FPO라는 기법을 알아야하는데, 난 아직 설명을 할 만큼 제대로 알지 못하기에 다른 블로그 글을 첨부한다.
https://dokhakdubini.tistory.com/228
[Stack] Frame Pointer Overflow, FPO에 대하여
오늘은 FPO, Frame Pointer Overflow에 대해서 알아볼 것입니다. SFP Overflow라고도 불립니다. FPO에 대한 풀이 글들을 보면 계속 leave가 ebp+4에 접근할 수 있다, sfp를 조작했으니 ebp를 조작할 수 있다이런..
dokhakdubini.tistory.com
한번에 이해하더라도 나중에 다시 보면서 곱씹어야할듯
일단 단순하게 말하면, 1바이트가 넘치니깐 그걸 buffer시작주소-4의 마지막 바이트를 넣어주면 된다.
왜 그렇냐? 위에 첨부한 글을 한 3번 정독하면 이해가 될 수도 있다.(난 이해했다 싶어도 다음날 다시보면 아리쏭하더라)
스택이 어떻게 쌓이는지는 아니깐, problem_child에 leave부분에 중단점 설정하고 코드를 넣어보면,
buffer의 시작주소는 bffff9e4이다.
밑에 x/12x $esp-8 부분을 보면, 마지막 바이트가 \x00 인것만 확인하면 끝
이 아니라 argv[2]부분의 주소도 알아내야한다. (그래야 거기로 보내지)
nop슬라이드를 태워서 보냈으니깐, 90부분 아무거나 잡자(쉘코드 앞쪽)