lob

golem

oogu ㅣ 2022. 12. 16. 20:41

/*
        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 

 

[Stack] Frame Pointer Overflow, FPO에 대하여

오늘은 FPO, Frame Pointer Overflow에 대해서 알아볼 것입니다. SFP Overflow라고도 불립니다. FPO에 대한 풀이 글들을 보면 계속 leave가 ebp+4에 접근할 수 있다, sfp를 조작했으니 ebp를 조작할 수 있다이런 말

dokhakdubini.tistory.com

진짜 상세히 설명이 되어있어 이것만 보면 이해가 될 것이다. (정리가 짱짱!)

바로 payload를 짜보자!

 

payload = shellcode 주소+ nop + shellcode + \x??  = 총 41byte이다.

 

우선 buffer 변수 주소를 찾아보자!

[그림 1-1]

빨간색 -> problem_child 함수 leave 명령어 수행 후 ebp가 가리켜야하는 주소

노란색 -> main 함수 leave 명령어 수행 후 esp가 가리켜야하는 주소, 값으로는 파란색 주소가 들어가야한다.

파란색 -> main 함수 ret 명령 수행 후 eip가 가리켜야하는 주소, 값으로는 shellcode가 들어가야한다.

 

위에 payload에서 \x?? 에 들어가야하는값은 b0 이다. -> 0xbffffab0 으로 점프하기 위해 

 

[그림 1-2]

성공!

FPO 개념은 기억하자 꽤나 재밌다 ㅎㅎ

'lob' 카테고리의 다른 글

darkknight  (0) 2022.12.16
skeleton  (0) 2022.12.13
vampire  (0) 2022.12.12
troll  (0) 2022.12.11
orge  (0) 2022.12.10