관리 메뉴

Information Security

Stack 3 본문

WarGame/Protostar

Stack 3

HackingPractice 2020. 9. 23. 15:38

volatile keyword를 사용하여 int type function pointer *fp를 선언한다. char type 64 byte array buffer를 선언한다. function pointer fp(함수의 주소)에 0을 대입한다. gets() 함수를 통해 user로부터 buffer에 문자열을 입력받는다.

만일 fp의 값(함수의 주소 값)이 0이 아니면 "calling function pointer, jumping to fp"를 출력하고 fp() 함수를 실행한다. 만일 fp가 0이면 아무것도 실행하지 않는다. void의 return을 갖는 win() 함수를 선언한다. win() 함수는 "code flow successfully changed"라는 문자열을 출력한다.

그림 3-1 stack 3

"A" * 4 입력 시 아무 반응 이 없고 무작위로 대입 시 Segmentation fault 메시지가 보여지는 것을 알 수 있다.

그림 3-2 erorr 메시지

stack 3을 gdb를 통해 분석해보았다.

그림 3-3 main 함수

RBP의 주소값을 통해서 gdb를 살펴보면 main + 27이다. main+27 : mov rdi, rax이므로 rax를 가져오는 값인 0x50과 브레이크 포인트가 걸린 fp의 0x8을 연산하면 된다. print 0x50 - 0x8은 72다.

그림 3-4 gdb 분석

fp의 조작을 위해 우리는 72 byte의 padding을 통해 fp에 접근할 수 있고, fp를 win()의 주소("0x0000000000401142")로 덮어 쓰면 될 것 같다.

그림 3-5 stack 위치

exploit 코드를 만들었다.

그림 3-6 exploit 코드

코드 실행 시 "code flow successfully chagned" 메시지가 보여지는 것을 알 수 있다.

그림 3-7 정답

'WarGame > Protostar' 카테고리의 다른 글

Stack 4  (0) 2020.09.23
Stack 2  (0) 2020.09.23
Stack 1  (0) 2020.08.31
Stack 0  (0) 2020.08.31
Peda 설치  (0) 2020.08.08