write-up/pwnable

[pwnable.kr] passcode

여니두 2019. 9. 29.

 

★ 문제 분석

- welcome()

name 배열이 100byte 선언되어 있다.

scanf("%100s", name);

: &이 빠져있음

 

- login()

scanf()로 passcode1를 입력받음.

fflush(stdin);

 

// 32bit는 bruteforcing에 취약하다.

scanf()로 passcode2를 입력받음

: &이 빠져있음

 

passcode1이 338150, passcode2가 13371337이어야 flag를 딸 수 있다.

 

☆ fflush(stdin)

데이터 입력 후 Enter를 치는 순간 입력 버퍼에 저장된다.

개행문자도 함께 입력 버퍼에 저장되는데, 출력할 때는 출력되지 않고 입력 버퍼에 남아있게 된다.

이를 처리하기 위해서 쓰는 것이 fflush(stdin)이다.

welcome+38> ebp-0x70 = name

0x70 = 112(dec)

 

stack에 40byte 공간 할당됨.

login+24> ebp-0x10 = passcode1

 

login+70> ebp-0xc = passcode2

 

passcode1와 name의 차이

: [ebp-0x70] - [ebp-0x10] = -0x60 (96byte) 차이

 

passcode1 입력 다음, fflush(stdin)이 있기 때문에 이 부분에서 system() 함수를 변조해주자.

 

☆ 결론

"\x90"*96 + scanf("%d", passcode1) >> fflush() got 주소 + system() 시작 주소로 got 주소 값 덮어쓰기

passcode1 값 변조 이후, fflush()의 got 주소의 값을 system("/bin/cat flag") 시작 부분으로 바꾸자.

 

- fflush() got 주소

login+47> fflush@plt 주소 = 0x8048430

>> fflush() got 주소 = 0x804a004

 

- system() 시작 주소

login+127: 0x080485e3

scanf()에서 10진 정수로 받기 때문에 바꿔주기

--> 134514147‬

 

>> "\x90"*96+"\x04\xa0\x04\x08"+"134514147"

 

 

 

(GOT Overwrite 다시 정리하기)

'write-up > pwnable' 카테고리의 다른 글

[pwnable.kr] input  (0) 2019.09.29
[pwnable.kr] random  (0) 2019.09.29
[pwnable.kr] bof  (0) 2019.09.28
[pwnable.kr] collision  (0) 2019.09.26
[pwnable.kr] fd  (0) 2019.09.23

댓글