Layer7 동아리 과제

포너블 4차시 과제

msh1307 2022. 10. 5. 01:12

NX bit : code segment를 제외하고 모두 실행 권한을 빼버리는 보호 기법이다.

원래 스택에 쉘 코드를 삽입하고 instruction pointer를 거기로 옮겨서 쉘을 실행시킬 수 있었는데, Nx 비트가 등장하면서 스택에 실행 권한이 제거되면서 쉘 코드를 사용하기 힘들어졌다. 

No eXecute라서 NX라고 부른다.

 

plt : procedure linkage table로 execute 권한이 존재한다. 

간단한 jmp 문이 존재한다.

여기서 got를 참조해서 libc로 점프한다.

Full Relro라서 처음에 dynamic linker가 got도 세팅을 해줘서 여기선 dl autoresolve가 빠져있다.

 

got : global offset table는 심볼에 맞게 libc랑 매칭 해놓은 테이블 정도로 보면 된다. 

그래서 여기엔 libc 주소가 들어가있다.

Partial Relro에서는 read/write 권한이 들어간다. 근데 Full Relro는 처음부터 매칭 시켜놓고 시작해서 write 권한이 제거되어있다.

 

RTL : Return To Library의 약자로, library로 점프 뛴다는 의미다.

Nx가 켜져 있어도, execute 권한이 있는 plt를 이용해서 libc로 뛸 수 있고, 결과적으로 함수를 실행하는 결과를 얻어낼 수 있다.

plt를 통해서 got에 적혀있는 libc의 주소로 점프할 수 있어서 RTL이다.

 

32 비트에선 인자가 스택으로 전달되니, system@plt + 리턴 주소 + a0 이런 식으로 ret를 덮으면 system을 실행시킬 수 있다. ROPgadget을 통해 pop ret 가젯을 찾고 system@plt + pop ret + a0 이런 식으로 주면 chaining이 가능하다.

pop을 얼마나 하는지는, 인자의 개수에 따라 달라진다.

여기서 가젯은 기본적으로 뒤에 ret가 붙어서 chaining을 가능하게 한다.

 

64 비트에선 인자가 우선 레지스터로 전달된다. 인자를 사실상 스택으로 전달할 일이 거의 없으므로, pop rdi나 pop rsi 가젯 등을 찾아서 사용해야 한다. pop rdi + /bin/sh의 주소 + system@plt 이렇게 주면 system("/bin/sh")를 실행시킬 수 있다.

 

simple_rtl64

bof가 터진다.

0x100이라 충분하다.

0x30 덮고 sfp 덮고 ret도 덮으면 된다.

system plt가 보인다.

rodata 잘 찾아보면 /bin/sh가 있다.

0x400773은 pop rdi ret 가젯이다.

400794는 /bin/sh 문자열 주소이다.

0x400509는 system의 movaps stack alignment 맞추려고 ret 가젯을 하나 더 썼다.

 

simple_rtl32

아까랑 똑같다.

0x48만큼 덮고, sfp, ret순으로 덮어주면 된다.

system plt도 있다. 

그래서 system plt를 통해 system을 부를 수 있다.

/bin/sh도 있으니까 이거 쓰면 된다.

약간 수정해서 system@plt + 리턴 주소 + /bin/sh 넣어줬다.

easy_rtl

canary leak 하고 ret 덮으면 된다.

rbp-0x40 - (rbp-0x8) + 1 만큼 더미 데이터로 덮으면 canary leak 할 수 있다.

system plt가 있다.

그래서 이걸 사용해서 system을 부를 수 있고, 인자로 /bin/sh를 주면 된다.

/bin/sh는 잘 찾아보면 데이터 섹션에 존재한다.

pop rdi + /bin/sh + ret + system plt 순이다.

ret는 stack align 맞추기 위해서 쓰였다.

 

basic_rtl

hashcode는

다음과 같다.

처음에 이 hash code랑 비교한다.

4바이트씩 총 20바이트를 비교하는데, 그냥 합만 똑같이 만들어주면 된다.

그래서 4로 나눠서 16바이트 넣고, 나머지 4바이트는 hash code에서 빼줬다.

printf의 심볼 주소를 제공한다.

서버의 libc 버전을 찾기 위해서 printf 심볼의 주소만으로는 부족해서 따로 puts got를 leak 해줬다.

두 개 정도면 충분히 검색할 수 있다.

잘 찾으면 나온다.

오프셋 구해서 system("/bin/sh") 호출하면 된다.

 

basic_rtl_v2

system이 호출되니, system plt를 사용할 수 있다.

1번 메뉴는 보호 기법을 프린트하는 메뉴다.

2번은 돈을 얻는 메뉴다.

3번과 4번은 돈을 통해서 주소를 제공받는 메뉴다.

5번은 bof가 터지는 메뉴다.

 

굳이 다 분석할 필요도 없다.

/bin/sh 문자열이 있고, system plt가 있으니 바로 5번 눌러서 rtl 하면 된다.

익스플로잇 코드다.

'Layer7 동아리 과제' 카테고리의 다른 글

포너블 마지막 과제  (0) 2022.10.31
포너블 5차시 과제  (1) 2022.10.18
포너블 3차시 과제  (0) 2022.09.25
포너블 2차시 과제  (0) 2022.09.21
포너블 1차시 과제  (0) 2022.09.18