[Wargame Write-up]/Lord of Buffer Overflow

[LoB RedHat 6.2] LEVEL 18: succubus -> nightmare

Kevin S. 2018. 8. 21. 06:30
LEVEL 18: plt


오랜만에 LoB 카테고리에 글을 남긴다.


buffer 크기는 40이고 strcpy@plt를 꼭 사용해야만 하는 구조로 되어 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/*
        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);
}
 
cs



우선 바이너리 복사 후 gdb에서 strcpy@plt의 주소를 확인하자.


strcpy@plt 주소: 0x8048410




공격 페이로드를 아래와 같이 구성할 예정이기 때문에, 영역이 구분되도록 알파벳으로 배치하여 실행 후 core 파일을 떨어뜨린다.


쉘코드는 환경변수에 등록해 사용할 것이다.


[ Dummy1 (40) ] [ SFP (4) ] [ &strcpy (4) ] [ Dummy2 (4) ] [ strcpy argv[0] (4) ] [ strcpy argv[1] (4) ] [&shellcode ]




core 파일 분석 결과 기존에 BBBB가 들어가야 할 자리에 AAAA로 치환되어 들어가 있는 것을 확인할 수 있다.


하얀 박스로 표시한 2개는 각각 strcpy의 첫 번째(argv[0]), 두 번째 인자(argv[1])가 될 것이다.


각각의 주소는 아래와 같다.


argv[0]: 0xbffffa90

argv[1]: 0xbffffa9c




SHELLCODE라는 이름으로 쉘코드를 등록할 것이기 때문에, 그 쉘코드가 있는 주소를 확인할 코드를 작성해두자.


1
2
3
4
5
6
#include <stdio.h>
#include <stdlib.h>
 
void main(void) {
  printf("SHELLCODE: %p\n", getenv("SHELLCODE"));
}
cs



SHELLCODE라는 환경변수에 쉘코드 바이너리를 넣은 후, 쉘코드의 주소를 파악하면 된다.


shellcode 주소: 0xbffffec1




지금까지 모은 재료들을 이용해 페이로드를 구성하면 succubus 권한의 쉘을 얻을 수 있다.