ROP (64byte) 문제 1번

2019. 4. 22. 18:16System Hacking/ROP(64byte)

prob


안녕하세요!

오늘은 ROP(Return Oriented Programming)에 대해서

알아보도록 할게요!


64bit의 ROP는

32bit의 ROP와 방법이 조금 달라서

문제를 통해서 알려드릴려고 해요!

(이번 문제는 32bit 방식으로도 풀려요)


문제 파일은 제가 여기에 업로드 해놓았습니다!

리눅스에서 wget명령어로 다운받으시면 됩니다!

소스코드는 아래와 같아요!


되게 간단하죠?


run이라는 함수가 불러지면

system("/bin/sh") => 쉘을 시켜주는 놈

알아서 쉘이 떨궈지죠?


vuln 함수는

buf에 16byte만 선언했는데!

read 함수로 256byte을 읽어오니

당연히 overflow가 발생하겠죠?

main 함수에서 vuln 함수를 call 하고요!


어떻게 exploit 하실지 보이시나요?


일단 리눅스에서 

아래와 같이 치면 

해당 파일에 걸린 

메모리 보호기법을 확인 할 수 있습니다!

(물론 pwntools를 리눅스에 따로 설치 하셔야 가능해요!)


<Format>

(명령어)  (파일 이름) => checksec  prob


그랬더니 

아래와 같이 정보가 뜨네요!


partrial RELRO => GOT overwrite가 가능하다

NO canary found => 메모리가 오염됐는지 확인하는 canary 기법이 없다

NX enabled => 스택에서 실행권한을 뺏다, 왜? 스택에서 shellcode 실행 못 시키게 하려고

PIE => 바이너리 영역의 랜덤화( bss 같은 곳들), 근데 여기선 활성화 안 됨 


NX 말고는 딱히 걸린 게 없네요!

그러면 exploit을 해볼까요?


저희는 결과적으로 run( )함수를 호출해서

쉘을 띄우면 성공하는 겁니다!

여기서는 저희가 run 함수에 인자를 주거나 

system함수에 인자를 따로 세팅해줄 필요가 없기 때문에 

아주 간단히 exploit이 가능합니다!


그냥 run을 call만 하면 되니까요!

= run의 주소를 넣기만 하면 된다!


gdb에서 디버깅해보시면 아시겠지만,

저희의 스택은 아래와 같습니다!


buffer // 16 바이트 

 ebp // 8 바이트

ret _address // 8 바이트   


따라서 저 ret_address에 run 함수의 주소만 넣어주면 문제가 풀립니다!

이걸 pwntools를 이용해서 exploit 코드를 작성했습니다!


(1) from pwn import *로 pwntools를 쓰겠다 선언하고


(2) prob 파일의 ELF을 읽어들이기 위해서 

ELF(" ./prob ")를 실행하고 그 결과를 e에 담습니다!


(3) 그리고 파일을 실행시키면 일어나는 process를

 process( ) 안에 e.path를 인자로 넣습니다!

이걸 짧게 줄이기 위해서 p라는 객체(변수)에 담습니다!


(4) raw_input(">>> ")는 디버깅 할 때 필요해서 

일단 넣어봤습니다!


(5) payload에 저희가 넣을 값을 적습니다! 

처음엔 '' 빈칸으로 선언합니다!

그리고 24byte(buffer+EIP)를 채웁니다!

이후에는 위에서 선언한 e객체에서

run 함수의 symbol을 읽어옵니다!

(=gdb에서 disas run해서 run 함수의 시작주소 갖고오는 것)

그리고 이것을 symbol 상태로 넣으면 안되고 

packing을 64bit로 맞춰서 해야하기에 p64( )로 

감싸서 payload에 전달합니다!


(6) 그리고 완성된 payload를 보내야 겠죠?

p.send( )에 payload를 인자로 넣어서

payload를 send 합니다!


(7) 그리고 payload를 잘주면 shell이 실행될테니

이 shell과 상호작용을 해야하기에

p.interactive( )를 적어줍니다!

위와 같이 exp1.py를 완성하고!

다시 쉘로 돌아와서

python exp1.py를 입력하면


아래와 같이 exploit이 가능한 것을 

볼 수 있습니다!


이번 문제는 32bit 방식으로도 풀려서

다음 문제부터 전형적인 64bit ROP 방식으로

풀어보겠습니다!


고생하셨습니다!




'System Hacking > ROP(64byte)' 카테고리의 다른 글

ROP (64byte) 문제 4번  (0) 2019.04.27
ROP (64byte) 문제 3번  (0) 2019.04.26
ROP (64byte) 문제 2번  (0) 2019.04.24