profile image

L o a d i n g . . .

1. 문제

checksec을 통해 확인한 보호 기법이다.

NX bit 만이 걸려있다.

+ ASLR 도 같이 고려해야 한다!

 

ida를 통해 까본 모습이다.

read 함수를 통해 입력을 받는데, 버퍼 크기보다 더 큰 100 byte 만큼 입력을 받아 bof가 발생한다.

기본적인 x86-rop 문제겠거니 하고 offset 들을 구하려는데, leak이 되지 않았다.

 

 

이 문제의 경우 static link 방식이라서 system 함수를 이용할 수 없었던 것이다.

 

 

그럼에도 NX와 ASLR 이 적용되어 있으므로 rop 기법을 이용해서 exploit 하는 것이 최종 목표일 것이다.

이때, mprotect()를 이용한 rop가 가능하다.

-> shellcode를 써놓고, 그 영역에 실행 권한을 줘서 exploit하는 방식

 

 

2. 문제 해결 과정

mprotect함수

int mprotect (void *addr, size_t len, int prot); 

 

기본적인 ROP Exploit은 system 함수를 이용하지만 해당 문제에서는 system 함수가 없기 때문에 mprotect를 이용한 메모리 영역 권한 변조로 ROP Exploit이 가능하다.

 

mprotect 함수는 기존에 메모리에 대한 접근이 제한되어 있는 메모리에도 권한을 부여할 수 있어, NX를 무력화 시킬 수 있다.

 

출처 : Lazenca

주의할 점은 void *addr 이 0x1000 즉, 4096의 배수여야 한다.

 

1. read()를 통해 bss 영역에 쉘코드를 씀. read(0, bss, len(shellcode));

2. mprotect()을 통해 bss 영역에 실행 권한을 줌. mprotect(bss, len(shellcode), 0x7);

3. bss 영역을 실행시키면 쉘코드가 실행됨.

 


이제 필요한 것들을 모두 구해보자!

 

 

buf_ret offset

main을 disassemble 한 모습이다.

 

main 함수 첫 부분과 read 함수를 호출하기 직전에 bp를 건다.

 

main 함수 첫 부분에서 bp가 걸렸다.

이때 esp는 ret를 가르키고 있다.

ret : 0xffffd03c

 

read 함수를 호출하기 직전에 bp가 걸렸다.

read 함수를 호출하기 전에 eax를 push 하고 있으므로, eax에 buf 주소가 들어있을 것이다.

buf : 0xffffd01c

 

buf와 ret 간의 offset = 32

 

 

bss address

objdump -h ~/Downloads/ropasaurusrex

단 주소는 0x4096 즉, 1000 단위여야 하므로 0x80ec000을 쓸 것이다!

 

 

Gadget

rp++을 이용해 구함. 

pppr : 0x8048913
pr : 0x80481c9

 

 

shellcode

x86 25byte shellcode

 

 

3. Exploit

위의 논리대로 payload를 작성해보았다.

 

성공적으로 쉘을 획득하였다!!

mmap, mprotect를 이용한 rop는 lazenca 에도 매우 정리가 잘 되어있어서 참고하면 좋을 것 같다!

 

참고
https://www.lazenca.net/display/TEC/03.ROP%28Return+Oriented+Programming%29+-+mmap%2C+mprotect
복사했습니다!