ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Toddler's Bottle] 5번.[passcode]
    $ 시스템 해킹 $/pwnable.kr 2018. 12. 2. 11:09

    이번에 풀어볼 문제는 pwnable.kr 5번문제인 [passcode문제 입니다.

    주요한 passcode.c 파일이 있네요 한번 확인해 보겠습니다.

    코드를 살펴 보면 main() -> welcome() -> login() 순서대로 들어가는 것을 있습니다.

    welcome()에서 이름을 입력 받은 뒤에 login()에서 passcode1,passcode2 입력 받아서 if문으로 비교 해서 맞으면 /bin/cat flag 실행 시키는 방식으로 이루어진 코드 같습니다.

     

    한번 코드를 실행시켜서 338150 13371337 넣어보겠습니다.

    Segmentation fault , 세그먼테이션 오류가 나네요

    이유를 보니 scanf에서 & 없습니다.

    &변수 형태가 변수가 들어있는 주소이고, 주소에 들어있는 값을 가져오는데, & 없으면 변수자체를 주소로 인식하여 여기에 입력한 값을 가져오게 됩니다.

     

    그래서 passcode1 passcode2 338150, 13371337 비교하는 것이 안됩니다.

    gdb 이용해서 실행파일을 확인해 보겠습니다.

    ↑↑ main함수

    ↑↑ welcome함수

    ↑↑ login함수


    welcome함수에서의 name변수는 ebp-0x70에서 부터 위치해 있고, passcode1변수는 ebp-0x10부터 위치해 있습니다.

    따라서 실제 name변수의 크기는 0x70-0x10 = 112 - 16 = 96byte입니다.

    여기 코드에서는 plt got 사용합니다

    ↑↑이처럼 말이지요.

    plt got http://noisivohees.tistory.com/22 에서 공부하시면 됩니다.

    ( printf plt주소는 got영역의 주소를 가리키고 있다. 그리고 다시 plt 영역으로 돌아오는데 dl_runtime_resolver 점프한다. )

     

    그래서 \x90 96 먼저 채운 뒤에 GOT@exit 위치를 더하고 flag 구성하면 됩니다.

    = (\x90*96)+(GOT@exit)+/bin/cat flag 구성

    -> got주소를 call해서 scanf변수로 들어가서 passcode1대신 입력을 받게 되는 것입니다.

     

    일단 \x90 96개를 넣어야 한다는 점은 앞에서 알아냈고, got@exit 위치를 찾아야합니다.

    got@exit readelf 명령어를 이용해서 찾을 있습니다.

     

    ----------------------------------------------------------------------------------------

    [readelf 명령어]

    ELF파일 형식(실행가능한 파일) 대한 정보를 보여준다.

     

    옵션 :

    -a | --all 모든 정보를 보여준다.

    -h | --file-header 시작 위치에 있는 헤더 정보를 보여준다.

    -l | --program-headers | --segment 파일의 세그먼트 헤더에 대한 정보를 보여준다.

    -S | --sections | --section-headers section header 정보를 보여준다.

    -s(소문자) | --symbols | --sym 파일의 심볼정보를 보여준다.

    --dyn-syms 동적 심볼정보를 보여준다.

    -e | --headers 모든 헤더정보를 보여줌 -h -l -s 같다.

    -A | --arch-specific 특별한 아키텍처 정보를 보여준다.

    ----------------------------------------------------------------------------------------

    plt 주소는 08048410, got.plt 주소는 08049ff4입니다.

    x/50i 0x08048410 0x08048410주소부터 50줄의 어셈블리어를 출력하는 명령어 입니다.

    exit@plt 주소는 0x804a018입니다.

     

    이번엔 login함수를 통해서 "/bin/cat flag" 주소를 확인해봅시다.


    /bin/cat flag 있는 주소는 0x080485e3입니다.

    0x0804a018 16진수로 적었지만 /bin/cat flag 주소는 10진수로 적었는데 이유는

     scanf 10진수로 받기 때문에 134514147 적어준 입니다.

     

    Flag Sorry mom.. I got confused about scanf usage :( 입니다


    '$ 시스템 해킹 $ > pwnable.kr' 카테고리의 다른 글

    [Toddler's Bottle] 3번.[bof]  (0) 2018.12.01
    [Toddler's Bottle] 4번.[flag]  (0) 2018.11.30
    [Toddler's Bottle] 2번.[collision]  (0) 2018.11.29
    [Toddler's Bottle] 1번.[fd]  (0) 2018.11.29

    댓글

Designed by Tistory.