Linux Exploitation/settings

[Pwnable] ROP 가젯 찾기 어려울 때 할 수 있는 방법들...

Rosieblue 2024. 1. 3. 14:27
728x90

plt 등을 알아도 인자를 넘겨주기 어려울 때 사용하면 좋을 것 같다.
 

objdump로 찾기

예를 들어 libc 모르는 경우,
PIE base 안다면(혹은 PIE가 적용되어있지 않다면) 코드 세그먼트 내에서 가젯 찾아보는 시도 가능
objdump 등으로 찾을 수 있다.
 
이를 사용한 문제는 아래!! (사실 내가 만든 문제다 ㅎㅎ 그런데 라업 보니까 이렇게 푸신 분들은 별로 없는듯...하다.. 그래도 이렇게 하면 무척 편리하게 풀수 있다!)
https://dreamhack.io/wargame/challenges/1071

 

Santa House

Description 산타 할아버지가 크리스마스를 맞아 드림이들을 모두 집에 초대해서 선물을 나눠주신대요! 착한 아이는 어쩌면 비밀스러운 선물을 받을 수 있을지도 몰라요. 시간은 넉넉하니 산타 할

dreamhack.io

 
 

return to csu 기법

사실 이거는 처음 알게된 기법인데 꽤나 유용할 것 같다
 
https://py0zz1.tistory.com/107

 

Return-to-Csu 기법 정리

포너블 문제를 풀 때, 64Bit 바이너리가 까다로운 이유가 바로 'Gadget' 때문이다. 64Bit의 Calling Convention은 Fastcall로 호출된 함수에 인자를 레지스터로 전달한다.이 때문에 Exploit을 구성할 때도 [POP RDI

py0zz1.tistory.com

 
 
아니면 return to main?? 근데 얘는 sfp조작을 어떻게 해야하는지 모르겠다ㅜㅜ
(main 왕 처음 프롤로그 부분으로 return하면 mov rbp, rsp가 있어서 ㄱㅊ긴함. 그런데 프롤로그 이후로 return하면 rbp가 바보가돼서 안됨 ㅠㅠ 스택 릭 가능하지 않는 이상..)
아니면....... plt주소를 main내 주소로 덮기..? 몰라...
 

 

+ libc leak하는 팁

libc base 모를 때, put(어쩌고_got) 이런식으로 하면 해당 함수의 주소 알 수 있다 하지만 ROP 필요..

그리고 보통 main함수의 return address에는 __libc_start_main으로 돌아가는데 얘는 라이브러리 안의 변수이므로!! 얘를 알아내면 libc base도 leak할 수 있당

 

참고로 libc 굳이 릭 안해도 걍 got의 하위 몇바이트만 overwrite하는 방법도 있다


더 좋은 기법들을 배우면 추가하겠다..