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)가 됩니다.
'High Level Technique > System Hacking' 카테고리의 다른 글
SigReturn Oriented Programming (SROP) (4) | 2016.05.07 |
---|---|
Return Oriented Programming (ROP) - final (0) | 2016.05.04 |
Return Oriented Programming (ROP) - step 1 (0) | 2016.04.28 |
Return to Library Chain (RTL Chain) (0) | 2016.04.28 |
Format String Bug (FSB) (0) | 2016.04.25 |