[pwnable.kr] bof

2021. 3. 3. 15:08pwnable.kr

Download에 적힌 링크에 접속하여 bof와 bof.c 파일을 다운로드하여준다.

( Linux 운영체제에서 다운로드한다. )

 

cat 명령어를 이용하여 bof.c의 코드를 확인한다.

bof.c 코드에서 gets함수를 사용하고 있다.

gets함수는 Buffer Overflow 취약점을 갖고 있으므로, 이를 통해 key값을 0xcafebabe로 바꾸어 주면 될 것이다.

 

Buffer Overflow 공격을 하기 위해 key의 위치와 입력받는 overflowme의 위치를 알아내야 한다.

gdb를 사용하여 bof를 실행시킨다.

disass func를 입력하여 func함수를 어셈블리 코드로 확인한다.

어셈블리 코드를 확인해보면, cmp 명령어를 확인해 볼 수 있다.

cmp명령어로 [ebp+0x8]과 0xcafebabe를 비교하는데, 이는 C언어 코드의

if(key == 0xcafebabe)에 해당하는 것을 알 수 있다.

따라서 [ebp+0x8]은 key를 가리킨다는 것을 알 수 있다.

 

하지만 입력에서는 overflowme변수를 gets로 입력받기 때문에 overflowme의 위치도 알아야 한다.

overflowme를 입력받는 것은 if문 바로 전에 입력받으므로, call 0x650 <func+36>이 gets인 것을 알 수 있다.

gets함수에 [ebp-0x2c]를 매개변수로 넣어주는 것으로 보아 [ebp-0x2c]가 overflowme인 것을 알 수 있다.

 

[ebp-0x2c]와 [ebp+0x8]의 거리 차이를 알아낸다면 overflowme를 입력하여 key에 접근할 수 있을 것이다.

0x8 - (-0x2c)는 0x34이므로 overflowme에서 key까지 52byte가 차이가 난다.

 

이제 Running at에서 적힌 것처럼 nc pnwable.kr 9000으로 실행시켜 52byte만큼 아무 값을 넣어주고,

0xcafebabe를 넣어주면 /bin/sh가 실행될 것이다.

※ nc(netcat) 명령어
넷캣(Netcat) TCP UDP 프로토콜을 사용하는 네트워크 연결에서 데이터를 읽고 쓰는 간단한 유틸리티 프로그램

- 사용법 :
nc [options] [target host] [ports]

[options]
-n : 호스트 네임과 포트를 숫자로만 입력받는다.
-v : verbosity를 증가 시킨다. 더 많은 정보를 얻을 수 있다.
-o : [filename]: 보내거나 받은 데이터를 헥스덤프하여 파일에 저장한다.
-u : TCP connection 대신에 UDP connection 이 이루어 진다.
-p : [port number or name] : local-port 를 지정한다. 주로 -l 과 같이 사용하게 된다.
-s : [ip address or DNS] : local ip address 를 지정한다. 모든 플렛폼에서 지원되지는 않는다.
-l : listen 모드로 nc을 띠우게 된다. 당연히 target host는 입력하지 않는다. (-p와 같이 사용)nc를 server 로서 쓸때 사용.
-e : [filename] : -DGAPING_SECURITY_HOLE 옵션으로 Make 되었을 때 사용가능하다.
-t : -DTELNET 옵션으로 컴파일 되었을 때 사용가능하다. 
      telnetd에 접속이 가능하도록 접속시 telnet과 같은 협상과정을 거친다.
-i : [interval time] : nc는 일반적으로 8K 씩 데이터를 보내고 받는데 
     그렇게 Standard input의 한 라인씩 interval time마다 보내게 된다.
-z : connection을 이루기위한 최소한의 데이터 외에는 보내지 않도록 하는 옵션.
-r : port 지정이 여러개로 되어 있으면 이때 scanning 순서를 randomize하고 
    (일반적으로 범위로 지정하면 높은 번호의 포트부터 스캔한다)
    또한 -p 옵션에서 지정가능한 local port도 randomize 합니다. 이때 주의 할 것은 -p가 -r을 override 한다는 것입니다.

(위 nc 명령어에서는 옵션을 사용하지 않았다.)

 

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

을 입력하여 실행하면 \x90(NOP)을 52byte만큼 입력하고, 0xcafebabe(\xbe\xba\xfe\xca)를 nc pwnable.kr 9000에

pipe로 넘겨주어 실행하게 된다.

 

실행 후, ls를 입력해주면 성공적으로 /bin/sh에 접속한 것을 알 수 있다.

여기서 cat명령어를 이용하여 flag를 확인한 후,

flag를 pwnable.kr 사이트에 접속하여 bof flag에 입력하여 주면 된다!


[ pwnable.kr bof Clear ]

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

[pwnable.kr] collision  (0) 2021.03.02
[ pwnable.kr ] fd  (0) 2021.02.28