해킹 - 110

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

UPX

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

UPX(Ultimate Packer for eXecutables)는 여러 운영체제에서 수많은 파일 포맷을 지원하는 오픈 소스 실행 파일 압축 프로그램이다. GNU 일반 공중 사용 허가서를 통해 공개된 자유 소프트웨어이다. 압축, 압축 해제의 기능을 모두 담당한다.



UPX는 압축 해제를 위해 두 개의 메커니즘을 지원한다.

  1. 인 플레이스(in-place) 테크닉
  2. 임시 파일로의 해제

실행 파일을 메모리로 해제하는 인 플레이스 테크닉은 모든 플랫폼에서 이용이 가능한 것은 아니다. 나머지 플랫폼에서는 임시 파일로의 압축 해제를 사용한다. 이 과정에는 추가적인 오버헤드와 기타 단점들이 동반되지만, 어떠한 실행 파일 포맷도 압축이 가능하게 한다.

임시 파일로 해제는 방식은 몇 가지 단점이 존재한다:

  • suid와 같은 특수 권한이 무시된다.
  • argv[0]의 의미가 없어진다.
  • 여러 인스턴스로 실행 중인 실행 프로그램들은 공통된 세그먼트를 공유할 수 없다.

수정되지 않은 UPX 압축이 자주 발견되며 바이러스 검사 소프트웨어 스캐너를 통해 압축이 해제된다. UPX 또한 이미 압축된 미수정 실행 파일들의 압축을 해제할 수 있는 기능이 자체 내장되어 있다.



UPX로 압축된 바이너리가 실행되는 대략적인 원리는 실제 실행코드를 data영역에 압축해서 넣고 EP부분에 코드의 복구/실행을 하는 루틴을 넣는 것이라고 합니다. 


이러한 패킹 소프트웨어들은 대부분 패킹과정에서 디버깅을 감지하고 차단하는 기능을 추가한다고 합니다.

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

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