Dyrandy

OneShot문제, One_Gadget을 이용한 문제풀이, (GOT, Offset) 본문

Concept Study/Pwn

OneShot문제, One_Gadget을 이용한 문제풀이, (GOT, Offset)

Dyrandy 2018. 11. 29. 03:46

한동안 펀을 안해서 머리가 많이 굳었다. 친구가 풀어보라고 문제를 하나 던져줬다.




일단 oneshot 바이너리를 아이다로 까본 결과다.

자세히 보면 주소를 릭하는 아주 간단한 구조라는 것을 알 수 있다.


그후 내가 원하는 곳으로 return해줘서 쉽게 접근 할 수 있다.



file을 보면 일단 동적으로 할당 되어있고


ldd로 보면 어떤 libc를 사용하는지 알 수 있다.


문제를 풀기에는 어렵지 않다.


1. 먼저 GOT안에 있는 내가 원하는 함수의 주소를 릭 해준다.

2. 내가 원하는 함수의 Offset을 구한다.

3. 1에서 찾은 주소 - Offset을 해서 Base를 찾는다.

4. 찾은 베이스에 One_gadget을 이용한 /bin/sh를 실행 시켜준다.


먼저 puts함수를 사용하기로 해서 puts의 got를 찾는다.



got자체 만으로 주소가 되는것이 아닌 GOT안에 함수의 실제 주소가 쓰여있다.

해서 프로그램을 이용해 PUTS의 주소를 확인해보면 아래와 같이 나온다.


요기서 알아야할 중요한 점은 끝 3바이트가 계속 동일하게 나온다는 점이다.



PUTS의 주소를 릭 해줬으니 나머지는 간단하다, Offset, 그리고 one_gadget만 사용해주면 된다.


먼저 one_gadget부터 보면, 

바이너리가 사용하는 libc에 쓰면 아래와 같이 나온다. 

요기서 어떤 /bin/sh를 써야할지 잘 몰라, 다때려 봤다.



그 다음으로는 puts의 offset을 구하는 방법인데.

offset구하는 것이 아직 많이 부족한것 같다.

계속 계산실수랑 잔실수를 많이해, 시간을 낭비한다.


objdump -D /lib/x86_64-linux-gnu/libc.so.6 | grep puts


위 명령어를 이용해 puts를 확인해준다.


요기서 0809c0이 바로 오프셋이다. 보면 9c0이 동일한 것을 알 수 있다!



해서 아래와 같이 익스 코드를 짜서 실행 시켜봤다.



아래와 같이 공격에 성공했다.




'Concept Study > Pwn' 카테고리의 다른 글

Format String Bug (FSB) 공부  (0) 2019.05.02
RTL Problem Solving  (0) 2018.08.05
RTL - return to library (DEP, chaining) 공부  (0) 2018.07.10
[system] PLT와 GOT 공부  (0) 2017.07.25
Comments