write-up/pwnable

[ftz] level 14: what that nigga want?

여니두 2019. 8. 23.

14_루틴 분기 키값의 이해(1)

 

√ 분기 루틴?

: 특정 조건을 만족할 때 분기하는 루틴

ex. SW 설치 시 시리얼키를 입력받는 것

- 은근 빠지지 않고 출제되는 문제!

- 스택 가드와 비슷한 개념. 메모리에 저장돼 있는 값을 정확하게 분석할 수 있는가?

 

- buf는 20byte 크기인데, fgets로 입력은 45byte까지 받게 되어있다.

>> buf에 쉘코드를 다 담을 수 없으며, 환경변수를 이용해야 한다.

담을 필요 없었다.

 

- check의 값이 0xdeadbeef여야 한다.

check 변수는 초기화되지 않았으니, 임의의 쓰레기값이 할당되어 있을 것.

 

 

√ gdb로 소스코드 분석

procedure prelude 과정

- 함수 프롤로그 부분

- main+3> stack에 56byte 공간 확보

: crap[4] check[4] buf[20] dummy[28]

 

** dummy 공간

: CPU가 값을 빠르게 읽어들일 수 있도록 CPU의 비트 수에 따라 더미가 적절한 공간에 들어가서

변수의 간격을 유지하게 됨

 

>> fgets(ebp-56, 0x2d, 0x8049664)

= fgets(buf, 45, stdin)

 

- ebp-16(check)과 0xdeadbeef 비교

같지 않으면 main+75로 JMP

 

>> setreuid(3095, 3095)

>> system("/bin/sh")

 

buf 배열과 check의 간격

(ebp-56)-(ebp-16) = 40byte

buf[20]
dummy[20]
check[4]
crap[4]
dummy[8]
SFP[4]
RET[4]

* 위 스택은 4byte 단위로 변수가 배열되는 그림.

 

 

√ 공격

** 페이로드

NOP[40] + 0xdeadbeef

 

- buf에 최대 문자열 fgets()로 44개 받을 수 있으니 buf[20] + dummy[20] + 
"0xdeadbeef"로 채우기 (by Little endian 방식)

 

Level 15 Password = guess what

 

* 변수 할당 공간 확인 예제

chk_distance.c

 

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

[ftz] level 16: about to cause mass  (0) 2019.08.24
[ftz] level 15: guess what  (0) 2019.08.24
[ftz] level 13: have no clue  (0) 2019.08.23
[ftz] level 12: it is like this  (0) 2019.08.21
[ftz] level 11: what!@#$?  (0) 2019.08.21

댓글