profile image

L o a d i n g . . .

1. 문제 의도 파악

문제에 나와있던 prob1 파일을 ida로 띄운 것이다.

지금 read와 gets 함수로 입력을 두 번 받고 있다.

그리고 gets 함수의 경우, 입력값 검증을 하지 않기에 buffer 크기인 20보다 더 크게 넣어 return address를 바꿀 수 있을 것이다.

그래서 쉘 코드를 어디에 넣을까 생각하다가, read 함수로 입력을 받는 name에 쉘 코드를 삽입하고

버퍼 s에 더미값과 name의 시작 주소를 넣어 쉘코드를 실행해보려 한다.

 

 

 

2. offset 구하기

name의 경우 50byte만큼 입력을 받는다. 따라서 쉘코드를 넣고 그 앞 뒤에 nop을 채워주면 될 것으로 생각된다.

그런데, 이때 name은 bss 영역이기 때문에 ASLR의 영향을 받지 않는다. 따라서 nop을 주지 않고, 쉘코드만 채워도 된다는 결론이 나온다.

 

 

그리고 버퍼 s의 경우 20byte만큼 입력을 받는데, main 함수의 스택프레임은 다음과 같다.

 

따라서 24byte 만큼을 더미값으로 채우고, RET에 name의 주소를 넣으면 될 것이다.

 

 

 

 

3. payload 작성하기

위의 논리 그대로 payload를 작성해보았다.

쉘코드를 name에 넣고, 버퍼 s에는 RET 전까지 더미값("A")를 주고 RET에 name의 주솟값을 넣어주었다.

 

 

방금 만든 bof_basic2.py를 실행 해 쉘을 획득하고 flag 까지 획득하였다!!

 

 

※ 또 다른 풀이법 : stack에 shellcode를 삽입하는 방법. RET 전까지를 더미값으로 채우고 RET 뒤에 쉘코드를 삽입하는데 aslr을 우회하기 위해 쉘코드 앞에 nop을 넣어준다. 그리고 RET에는 nop의 중간 주소쯤을 준다.

 

 

'Wargame > HackCTF' 카테고리의 다른 글

[HackCTF] x64 Simple_size_BOF  (0) 2021.03.19
[HackCTF] Basic_FSB  (0) 2021.03.19
[HackCTF] Basic_Bof #2  (0) 2021.03.19
[HackCTF] Basic_Bof - Simple_Overflow_ver_2  (0) 2021.03.13
[HackCTF] Basic_Bof #1  (0) 2021.03.04
복사했습니다!