2021. 3. 3. 15:08ㆍpwnable.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 |