문제 소스는 아래와 같다.
/*
        The Lord of the BOF : The Fellowship of the BOF
        - bugbear
        - RTL1
*/

#include <stdio.h>
#include <stdlib.h>

main(int argc, char *argv[])
{
        char buffer[40];
        int i;

        if(argc < 2){
                printf("argv error\n");
                exit(0);
        }

        if(argv[1][47] == '\xbf')
        {
                printf("stack betrayed you!!\n");
                exit(0);
        }

        strcpy(buffer, argv[1]);
        printf("%s\n", buffer);
}

이전 문제와 달리 strcpy함수를 사용한다. 그리고 이전에 풀었던 문제들과 다른점은 argv[1]에 넣은 RET가 0xbf------여야 한다는 조건이 있었으나 이번에는 \xbf가 아니여야 strcpy함수를 호출할 수 있다.

간단하게 RTL로 풀 수 있다.

RTL의 payload는 NOP[44]+system address[4]+NOP[4]+/bin/sh address 이다.

system 함수의 주소와 /bin/sh의 주소를 알기 위해 GDB에서 leave에 BP를 걸고 실행한 후 system 함수의 주소를 알아냈다.


마찬가지로 /bin/sh의 주소를 알아야하는데 이를 알아내는 C코드를 컴파일하여 실행했다. 소스는 아래와 같다.


컴파일한 후 실행하면 아래와같이 주소가 나온다.


필요한 값들을 알았으니 payload를 작성했다.


쉘이 따졌다.



'Wargame > lord of bufferoverflow' 카테고리의 다른 글

Lord of bufferoverflow giant  (0) 2017.08.26
Lord of bufferoverflow bugbear  (0) 2017.08.22
Lord of bufferoverflow golem  (0) 2017.08.21
Lord of bufferoverflow skeleton  (0) 2017.08.21
Lord of bufferoverflow vampire  (0) 2017.08.18

+ Recent posts