본문 바로가기
.study/pwnable

[포너블 기초]Shell Craft, Lazy Binding

by Carry_on 2023. 10. 25.

Shell Craft

shellcraftpwntools에서 제공하는 간단하게 셸코드를 만들어주는 강력한 도구이다.

기본적인 문법은 shellcraft [환경].[OS].[syscall 함수](함수 인자) 이다.

소스코드 맨위에
context(arch='i386', os='linux') or context(arch='amd64', os='linux’ 를 넣어주면 shellcraft.[syscall함수](함수 인자)

이렇게 사용가능하다.

 

http://docs.pwntools.com/en/stable/shellcraft/i386.html - i386

http://docs.pwntools.com/en/stable/shellcraft/amd64.html  - amd64

위의 링크에서 추가적인 사용법을 확인 할 수 있다.

 

PLT, GOT

PLT(Procedure Linkage Table)

외부 라이브러리 함수를 사용할 수 있도록 주소를 연결 해주는 테이블이다.

 

GOT(Global Offset Table)

PLT에서 호출하는 resolve() 함수를 통해 구한 라이브러리 함수의 절대 주소가 저장되어 있는 테이블이다.

 

C언어에서 printf와 같은 외부 라이브러리 함수를 사용하기위해 PLT
호출되면, PLT는 다시 외부 함수들을 호출하기 위해
함수들의 주소가 들어있는 GOT를 참조한다.

 

Static Link

gcc을 이용해 컴파일 할 때 –static 옵션을 주면 실행 파일 안에 라이브러리 동작 코드가 포함되기 때문에 별도의 추가 작업 없이, 실행 바이너리만으로 라이브러리 함수들을 사용할 수 있게 된다.

Dynamic Link

라이브러리를 실행 파일에 포함시키는 것이 아니라 라이브러리를 하나의 메모리 공간에 매핑하고 이를 프로그램이 공유해서 사용하게 된다.

Dynamic Link 방식으로 컴파일 할 때 PLTGOT가 사용된다.

 

Lazy Binding

Lazy bindinglazy linking 또는 on-demand symbol resolution이라고도 한다.

앞의 Static 방식처럼 모든 외부 함수의 주소를 한 번에 로딩하지 않고,

Dynamic 방식으로 함수 호출 시점에 해당 함수의 주소만 공유 라이브러리로부터 알아오는 것을 말한다.