본문 바로가기

High Level Technique/System Hacking

Return Oriented Programming (ROP) - step 2

Return Oriented Programming (ROP) - step 2



목표


L.O.B FC3 evil_wizard를 이용하여 ROP를 socket을 이용하여 어떻게 페이로드를 작성하는지 알아보도록 하자.



설명





위 C 코드는 LOB FC3 evil_wizard 입니다.  해당 문제의 주석을 확인해 보면 8888포트로 접속하여 하라고 합니다.


먼저 공격 방법을 생각해 봅니다. step1에서도 system("/bin/sh")를 만들어서 사용했었습니다. /bin/sh를 .bss영역에 넣어뒀었죠.



system() 주소, /bin/sh 주소, pop pop ret 주소 strcpy() 주소 를 찾아야 합니다.




.bss 주소



.bss section의 주소는 0x8049868 입니다.





strcpy() 주소




strcpy()의 주소는 0x8048438 입니다.




system() 주소




objdump를 이용하여 system()를 찾을 수 없습니다. 프로그램 내에 없기 때문이죠. 하지만 함수가 하나만 실행되도 libc.so.6 때문에 모든 정보가 올라가죠. gdb를 통해서 main에 브레이크 포인트를 걸고 system의 주소를 찾습니다.


system의 주소는 0x7507c0 입니다.




system 주소의 값 찾기









printf() 주소 찾기









pop pop ret 찾기


dart_stone의 소스코드를 확인하면 pop pop ret를 할 수 있도록 함수를 주어줬습니다. 해당 함수의 주소를 이용하도록 하겠습니다.




pop pop ret의 주소는 0x80484f0 입니다.






/bin/sh 주소 찾기

















지금까지의 정보들을 정리하면 아래와 같습니다.








자 일단 필요한 정보들을 대충 찾았습니다. 실제로 buffer에 어느 정도로 값이 들어가는 지 확인해 보도록 하겠습니다.




ebp-0x108이 buffer의 주소입니다. 따라서 0x108만큼 값이 들어갈 수 있다는 말인데, 이 값은 십진수로 264가 됩니다.



그러면 아래와 같은 페이로드를 작성할 수 있습니다.






printf_got를 system의 주소로 덮은 후 system이 실행되도록 하고, /bin/sh를 만들어 printf_plt와 같이 실행시킵니다.


printf(bss)와 같은 형식으로 실행이 되지만 printf_got에는 system의 주소가 들어있기 때문에 printf(bss)는 system(bss)가 됩니다.