Profile

머리정리하는곳

c2w2m2

[Codegate] yocto

할것도 많고 1일 1폰도 하느라 바빠졌네요. 이렇게 바빠야 하는 맛이 나는거죠!


이번에는 Return to dl resolve 를 이용한 yocto 문제를 풀어보겠습니다.


저는 이 기법은 H4C 발표에서 NextLine 님의 발표로 처음 알게 되었는데, 그떄 64bit ROP 도 모르던 저는 


암것도 몰랐지만 지금와서 익히게 되었습니다.


사실 처음에는 기법도 같이 올릴려고 했는데 잘 정리된 문서가 많아서 대체하겠습니다.


Hackerz on the ship블로그의 문서 

pwn3r님의 문서

진용휘님의 문서

진용휘님의 문서 링크중 한글이 깨진 문서가 있어 이를 ghostbin 에 옮긴 문서


이 문서들을 읽으면 마스터..! 할수 있습니다.


간략하게 정리하자면


plt 호출 => got에 있는 함수 주소로 이동 => 실행


하는 plt-got 구조에서 got 에 함수 주소가 없는 첫 실행때는


plt 호출 => 

got 에 적혀있는 plt + 6 주소로 이동 => 


reloc_offset와 link_map 포인터를 인자로 _dl_runtime_resolve를 호출 => _


dl_runtime_resolve 내에서 reloc_offset와 link_map 포인터를 인자로 _dl_runtime_resolve를 인자로 _dl_fixup 호출 => 


내부에서 STRTAB, JMPREL, ELF32_Rel 구조체, DYNSYM, ELF32_Sym 구조체들을 잘 엮어서 STRTAB 내부에 있는 함수이름을 찾고 이를 인자로 _dl_lookup_symbol_x 를 호출 => 


_dl_lookup_symbol_x 에서는 SYMTAB, libc offset을 구해옴 => 


다시 _dl_fixup 에서 libc_base + offset 을 해서 함수 주소를 구한후 GOT 에 적음 => 


GOT에 있는 함수 주소 호출


가 됩니다. 최대한 간략하게 한다고 했는데 복잡하네요 ㅠㅠ..


여기서 _dl_lookup_symbol_x 를 호출할때 넘겨주는 인자인 함수 이름을 바꾼다면 어떻게 될까? 라는게 


Return to dl resolve 기법의 시작입니다.





이를 간단하게 gdb 상에서 봐봅시다.



이런 간단한 코드로 실험해봅시다.



다음같이 reloc_offset 을 push 하는곳에 bp 를 걸고 실행한 다음 ni 좀 해서 따라가 보면





이런식으로 link_map 구조체를 push 하고 _dl_runtime_resolve 로 뛰는모습.



_dl_runtime_resolve



에서 _dl_fixup 을 호출하는 부분



_dl_fixup 에서 STRTAB 을 찾는 부분인데 eax + 4 가 STRTAB 이 담긴 주소입니다.



그쵸? 그럼 이젠 저 puts 를 system 으로 바꿔서 실행해보겠습니다.



이렇게 한후 c 를 눌러주면?



system이 호출되네요 : )


다만 뒤에 __libc_start_main 도 같이 덮여서 실행은 안되고 꺼질겁니다.


어쨋든 이런식으로 익스가 가능하다를 확인했네요 : ) 실제 익스로 가봅시다.




yocto 문제 분석을 먼저 해봅시다



그냥 glob 이라는 bss 에 80 바이트 받고 shutdown 으로 fd 닫고 2번째 . 주소로 jmp 하네요.


Return to dl resolve 로 풀립니다.



페이로드는 이렇습니다.


위에 rel_addr 계산하고 offset 계산하고는 그냥 하시면 되는거고


ELF32_Rel struct 가 제가 짤때는 가장 문제였는데


문서를 보면



로 되어있어서


앞에 r_offset 에 넣은 0x8049540 은 제가 그냥 덮고 싶은 주소, 그러니까 libc 주소를 구해서 어디다 써넣을지 정도인데, 


그 뒤에는 r_info 에서 뒤에 몇바이트는 재배치 형식, 그앞은 인덱스 넘버라고 알고있어서


00 01 46 07 로 나누어서 뒤에 7 은 재배치 형식인건 이해가 가는데 앞에 146은 system 의 인덱스 넘버인가 생각하고있습니다.


쩃든 저런식으로 짜주면 _dl_runtime_resolve 할때의 STRTAB 함수 이름이 조작이 가능하고, 이를 통해서 system 을 호출할 수 있습니다.


고로



쉘을 딸 수 있습니다

'Pwnable' 카테고리의 다른 글

[HITCON2016] secretholder  (0) 2018.01.04
[Noe] Card  (0) 2017.12.14
[HITCON] start  (0) 2017.12.11
[Pwnable.tw] hacknote  (0) 2017.12.10
[codegate2017] messanger  (0) 2017.12.04