분류 전체보기 - 148

  1. Toddler's Bottle - mistake 2016.01.04
  2. Toddler's Bottle - leg 2016.01.04
  3. Toddler's Bottle - input 2015.12.28
  4. Toddler's Bottle - random 2015.12.28
  5. Toddler's Bottle - passcode 2015.11.24
  6. 다중 파이프 페이로드 2015.11.24
  7. GOT overwrite 2015.11.24
  8. Toddler's Bottle - flag 2015.11.24

다중 파이프 페이로드

해킹/개념 정리 2015. 11. 24. 23:15

예컨데 어떤 문제에서 입력을 여러번 받는다면 하나의 파이프로는 입력을 전부 못할 수 있습니다. 운좋게 scanf만 사용한다면야 공백문자를 중간에 넣어서 구분해 줄 수 있겠지만 다른 입력함수는 공백역시 입력으로 받아버리는 경우가 많습니다.

이럴때 불편해서 실험해보고 알게된 사실인데 '|'(파이프) 를 여러개 이용해서 여러개의 인자를 프로세스로 전달할 수 있더군요.


ex) (python -c 'print "인자2";cat)|(python -c 'print "인자1"';cat)|./프로그램


위 예시와 같이 인자는 뒤에서부터 먼저 들어갑니다. 헷갈리지 않게 조심!



또한 이 방법을 이용해서 gdb에서 파이썬 파이프를 사용할 수 없었던 불편함을 조금이나마 줄일 수 있습니다.


ex) (python -c 'print "인자2"';cat)|(python -c 'print "인자1"';cat)|(python -c 'print "r"';cat)|(python -c 'print "b bp주소"';cat)|gdb 프로그램


이런식으로 특정 라인에 bp를 걸고 실행후 인자 전달까지 python을 이용해서 입력한 후 동적 디버깅을 할 수 있습니다.


'해킹 > 개념 정리' 카테고리의 다른 글

ASLR의 개념  (0) 2016.01.13
함수의 프롤로그와 에필로그에 관한 고찰 + fake ebp(실패)  (0) 2016.01.13
GOT overwrite  (0) 2015.11.24
UPX  (0) 2015.11.24
file destriptor  (0) 2015.11.24
Tags
Social

GOT overwrite

해킹/개념 정리 2015. 11. 24. 22:06

PLT(Procedure Linkage Table)

PLT는 일종의 실제 호출 코드를 담고 있는 테이블로써 이 내용 참조를 통해 _dl_runtime_resolve가 수행되고, 실제 시스템 라이브러리 호출이 이루어지게 됩니다.

 

GOT(Global Offset Table)

GOT는 PLT가 참조하는 테이블로써 프로시져들의 주소를 가지고 있습니다. PLT가 어떤 외부 프로시져를 호출할 때 이 GOT를 참조해서 해당 주소로 점프하게 됩니다.



- printf 함수 호출이 처음일 때

[printf 함수 호출]--->[PLT로 이동]--->[GOT 참조]--->[다시PLT로 이동]--->[_dl_runtime_resolve]--->[GOT 저장 후, 실제 함수 주소로 점프]

 

 

 

- printf 함수 호출이 처음이 아닐 때 (GOT에 실제 printf 주소가 저장되어 있음)

[printf 함수 호출]--->[PLT로 이동]--->[GOT 참조] ===> printf 함수로 점프




--------------------------------------------------------------------------------------------출처: http://bbolmin.tistory.com/33


정리하면 함수가 한번도 실행되기 전 GOT에는 PLT가 GOT로 점프하는 명령어의 바로 다음 주소가 들어있습니다. 따라서 그냥 jmp 뒤에 PLT 안의 명령어들을 쭉 실행하는 것과 같겠죠. 그러면 _dl_runtime_resolve라는 함수를 호출하게 되는데 이 함수가 실행되고 나면 GOT에 실제 함수의 주소가 들어가게 됩니다. 따라서 다음부터는 plt-got-함수 순서로 바로 함수를 호출할 수 있게 되는 것이지요.



이런 과정은 그냥 GOT와 PLT에 대한 이해를 돕기 위한 것일 뿐이고 GOT overwrite에서 중요한 점은 PLT가 GOT의 주소를 상수로 가지고 있기 때문에 GOT의 주소는 변하지 않는다는 것, 그리고 _dl_runtime_resolve 함수에 의해 변경되는 부분이므로 공격자에 의해서도 변경될 수 있다는 것입니다. GOT의 값을 바꿔주면 프로그램 내에서 해당 함수가 호출될 때 실행되지 않고 내가 원하는 주소로 점프하도록 할 수 있습니다.

'해킹 > 개념 정리' 카테고리의 다른 글

ASLR의 개념  (0) 2016.01.13
함수의 프롤로그와 에필로그에 관한 고찰 + fake ebp(실패)  (0) 2016.01.13
다중 파이프 페이로드  (0) 2015.11.24
UPX  (0) 2015.11.24
file destriptor  (0) 2015.11.24
Tags
Social