ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [L.O.B] Level 18 - succubus
    Wargame/L.O.B 2022. 11. 10. 06:52
    반응형

    Level 18 - succubus를 풀어보자.

     

    소스 코드를 보면 다음 Level은 nightmare이고, PLT라는 힌트가 있다.

    제약 조건은 check address와 dangerous waterfall이 있다.

    check address로 인해 strcpy 함수의 주소를 argv[1]의 44번째 값부터 넣어주어야 한다.

    dangerous waterfall은 buffer의 48번째 값부터 4 바이트를 'A'로 만든다.

    <nightmare 소스 코드의 내용>

     

    gdb를 통해 더미 값과 특별한 동작이 있는지 확인해보자.

    더미 값은 없고, 눈에 띄는 특별한 동작도 없는 것 같다.

    <nightmare 파일 gdb 분석>

     

    이 Level은 어떻게 해결해야 할까?

    힌트에 있는 내용인 PLT에 대해 알아보도록 하자.


    [PLT]

    더보기

    PLT는 GOT와 함께 쓰이는 용어이다.

    먼저 PLT는 Procedure Linkage Table로, 외부 프로시저를 연결해주는 테이블이다.

    간단하게 말하자면, 공격을 하면서 함수들을 호출하기 위해 알아내던 주소라고 할 수 있다.

     

    GOT는 Global Offset Table로, PLT가 참조하는 테이블이며 실제 프로시저들의 주소가 들어있다.

    즉, PLT가 외부의 프로시저를 호출하면 GOT를 참조하여 해당 함수의 실제 주소로 점프한다.

     

    이 두 가지를 이용한 공격은 다양하므로, 앞으로 공부하면서 정리를 할 수 있도록 하자.


    이번 Level을 풀기 위해 필요한 정보는 &system, &/bin/sh, &strcpy, &buffer이다.

     

    우선 간단하게 알 수 있는 system 함수의 주소와 strcpy 함수의 주소를 알아보자.

    gdb를 통해 main 함수를 disassemble 하면 sytcpy 함수의 주소가 0x8048410인 것을 알 수 있다.

    그리고 main 함수에 break를 걸고, 실행 시킨 후 system 함수의 주소를 print 하면 주소를 알 수 있다. 

    <strcpy, system 함수의 주소>

     

    다음으로 소스 코드를 작성해 컴파일 하여 /bin/sh의 주소를 알아낼 수 있다.

    </bin/sh의 주소>

     

    이제 buffer의 주소를 알아보도록 하자.

    buffer는 gdb에서 strcpy 함수가 끝난 지점인 <main+115>에 break를 걸고 파이썬 명령을 넣어 실행시킨다.

    다음으로 분석을 하면 buffer의 주소는 0xbffffae0인 것을 알 수 있다.

    <buffer의 주소>

     

    알아낸 정보들을 바탕으로 페이로드를 작성해보자.

    페이로드는 &system + NOP*4 + &/bin/sh + NOP*32 + &strcpy + NOP*4 + [&buffer+48] + &buffer이다.

    이 페이로드의 의미는 이렇게 된다.

     

    buffer의 RET가 strcpy 함수의 주소로 지정되어 있다.

    strcpy 함수의 원형은 char* strcpy(char* dest, const char* origin)이다.

    공격은 strcpy의 인자들인 dest에 buffer+48의 주소를, origin에 buffer의 주소를 넣는다.

    (buffer+48은 strcpy의 RET로, 이곳에 origin인 buffer의 주소를 복사해 넣게 되는 것이다.)

    이것을 통해 strcpy의 RET에서 system 함수를 실행해 쉘이 실행되도록 만드는 것이다.

     

    작성한 페이로드를 입력하고 프로그램을 실행하면 nightmare의 권한으로 쉘이 실행된다.

    my-pass를 입력하면 비밀번호가 나타난다.

    <나타난 비밀번호>

     

    반응형

    'Wargame > L.O.B' 카테고리의 다른 글

    [L.O.B] Level 20 - xavius  (0) 2022.11.14
    [L.O.B] Level 19 - nightmare  (0) 2022.11.11
    [L.O.B] Level 17 - zombie_assassin  (1) 2022.11.10
    [L.O.B] Level 16 - assassin  (0) 2022.11.06
    [L.O.B] Level 15 - giant  (0) 2022.11.06

    댓글

Designed by Tistory.