상세 컨텐츠

본문 제목

r0pbaby 풀고 정리

SYSTEM HACKING/CTF, etc

by koharin 2019. 8. 16. 23:32

본문

728x90
반응형

1. NX 가 걸려있어서 쉘코드는 못 올리고…PIE가 있어서 메모리 주소가 계속 변한다

=> offset 구하고 exploit 코드 짤 때 실행 시 libc base 주소나 libc function 주소 구하면 된다.

 

2 .최근 푸는 바이너리들은 disas main도 안 되서 디버깅을 못 했었는데 방법을 찾았다.

=> 그냥 run 하면 된다! (계속 오류떠서 안 되는 줄 알았다^^;)

(bp를 잡아서 bufferreturn address 거리는 못 구하지만..이건 방법을 찾아봐야겠다.)

 

3. (gdb) set stop-on-solib-events 1

 

이번 r0pbaby 처럼 실행하면 while(1)이 계속 있어서 gdb 가 멈추기 힘든데

 

(gdb) set stop-on-solib-events 1

(gdb) run

(gdb) c

 

하면 offset 구할 때 편하다. (굳이 bp를 잡지 않아도..!)

 

 

4. IDAbuffer 크기 구하려는데 [rbp+0h] 일 때!!!

 

당황하지 않고 …rbp니까 SFP에 위치하나보다라고 생각하자.

(이번 문제는 따로 bufferreturn address를 구하지 않아도 되서 편했다는..)

따라서 savedregsSFP부터 시작하므로 SFP(8) + return address(8) + …

으로 return address를 변조할 수 있다.

 

5. x64의 인자 전달 => “pop rdi; ret”

 

System 함수처럼 인자 값 하나를 저장할 때 “pop rdi; ret” 가젯을 사용한다.

두 번째 인자는 “pop rsi; ret”

첫 번째, 세 번째 인자 저장은 “pop rdi; pop rdx; ret”

 

6. x64의 구조 => “pop rdi; ret” + 첫 번째 인자 + &system

 

따라서 RTL 공격 시

 

&”pop rdi; ret” + &“/bin/sh” + &system

 

으로 payload 전달하면 된다.

 

7. ROP에 필요한 정보 구하기

 

Gdb-pedapwndbg 가 안 되는 상황에서 어떻게 하면 두 개의 debugger 없이 gadgets“/bin/sh” 주소를 어떻게 구할까 했는데구할 방법이 있었다!

 

# gadget 구하기

 

- ++rp 사용 (x86이면 rp-lin-x86 실행파일, x64이면 rp-lin-x64 실행파일 설치)

 

$ ./rp-lin-x64 -f /lib/x86_64-linux-gnu/libc-2.23.so -r 4 | grep "pop rdi"

 

위와 같이 원하는 가젯 주소나 offset을 구할 수 있다.

 

 

 

(libc 파일로 할 경우 offset, 공격 대상 파일로 할 경우 주소를 구할 수 있다.)

 

- objdump 명령어 사용

 

$ objdump -d ./ropsaurusrex | grep -B3 “ret”

 

위와 같이 사용.

둘다 사용해본 결과, ++rp가 더 잘 찾는다.

 

# address 구하기

 

gdb에서 실행파일 run 한 후,

(gdb) x system

또는

(gdb) p system / p &system

으로 구한다.

 

* “/bin/sh” 찾기

 

(gdb) find &system, +9999999, “/bin/sh”

 

 

$ strings -t x /libc/x86_64-linux-gnu/libc-2.23.so | grep "/bin/sh"

 

# offset 구하기

 

gdb에서 run한 상태에서

 

(gdb) info proc map

 

으로 libc start addr를 찾는다. 그리고

 

(gdb) p/d &system - &(libc start addr) => decimaloffset 구하기

(gdb) p/x &system - &*libc start addr) => hexdecimaloffset 구하기

 

$ gdb -q /lib/x86_64-linux-gnu/libc-2.23.so

로도 debugging해서 필요한 정보(주소, offset ) 찾을 수 있다.

 

 

 

728x90
반응형

'SYSTEM HACKING > CTF, etc' 카테고리의 다른 글

[tuCTF] shella-easy  (0) 2019.08.23
[HITCON-Training] lab4 : ret2lib  (0) 2019.08.18
[Defcon 2015] r0pbaby  (0) 2019.08.16
[PlaidCTF 2013] ropasaurusrex  (0) 2019.08.15
[HITCON-Training] lab5 : simplerop  (0) 2019.08.15

관련글 더보기