fedora 원정대 core 3 hell_fire -> evil_wizard
evil_wizard.c
hint 를 보면 GOT overwritting이 써있다. GOT overwritting 공격을 시도하여 쉘을 얻을 수 있다.
strcpy함수에서 overflow가 발생하여 eip를 원하는 곳으로 이동 시킬수 있게된다.
eip를 strcpy의 plt(고정주소)로 이동시켜 strcpy함수를 호출할 수 있고 ret에 poppopret가젯의 주소를 넣어 rop공격코드를 작성 할 수 있다.
strcpy를 이용하여 memset의 got에 system함수의 주소를 1바이트씩 복사 할 것이다. 그러면 memset을 호출하게되면 결국 memset의 got에 덮어씌여진 system함수를 호출 하게된다.
system함수에 인자로 들어갈 '/bin/sh'문자열도 위와 같은 rop 방식으로 strcpy함수를 호출하여 memcpy의 got에 복사하여 system함수의 인자로 넘겨 줄 것이다.
이제 필요한 주소들을 찾고 코드를 작성하면 된다.
먼저 poppopret가젯의 주소는
poppopret의 주소는 0x0804854f이다.
execve로 덮힘을 당할 memset@plt와 memset got를 찾는다.
memset@plt의 주소는 0x08048474이다.
got의 memset주소는 0x08049898이다.
got의 memcpy주소는 0x080498c0이다.
system의 주소는 0x007507c0이다.
strcpy@plt의 주소는 0x08048494이다.
필요한 got, plt주소는 구했으니
system의 주소, /, b, i, n, /, s, h가 있는 주소를 다 구하고 strcpy를 이용해서 1바이트씩 덮어 써야한다.
이렇게 전부다 뒤져서 익스플로잇 코드를 작성한다.
ret부분에 strcpy가 덮이고 인자로 덮힘당할 memsetgot의 주소와 덮을 문자의 주소가 들어간다. strcpy함수가 끝나면 poppopret 이 수행되어 인자 두개를 제끼고 다시 strcpy함수로 들어가는 rop이다.
공격을 하면
쉘을 얻을수 있다.
쉘코드:
Read more
evil_wizard.c
hint 를 보면 GOT overwritting이 써있다. GOT overwritting 공격을 시도하여 쉘을 얻을 수 있다.
strcpy함수에서 overflow가 발생하여 eip를 원하는 곳으로 이동 시킬수 있게된다.
eip를 strcpy의 plt(고정주소)로 이동시켜 strcpy함수를 호출할 수 있고 ret에 poppopret가젯의 주소를 넣어 rop공격코드를 작성 할 수 있다.
strcpy를 이용하여 memset의 got에 system함수의 주소를 1바이트씩 복사 할 것이다. 그러면 memset을 호출하게되면 결국 memset의 got에 덮어씌여진 system함수를 호출 하게된다.
system함수에 인자로 들어갈 '/bin/sh'문자열도 위와 같은 rop 방식으로 strcpy함수를 호출하여 memcpy의 got에 복사하여 system함수의 인자로 넘겨 줄 것이다.
이제 필요한 주소들을 찾고 코드를 작성하면 된다.
먼저 poppopret가젯의 주소는
poppopret의 주소는 0x0804854f이다.
execve로 덮힘을 당할 memset@plt와 memset got를 찾는다.
memset@plt의 주소는 0x08048474이다.
got의 memset주소는 0x08049898이다.
got의 memcpy주소는 0x080498c0이다.
system의 주소는 0x007507c0이다.
strcpy@plt의 주소는 0x08048494이다.
필요한 got, plt주소는 구했으니
system의 주소, /, b, i, n, /, s, h가 있는 주소를 다 구하고 strcpy를 이용해서 1바이트씩 덮어 써야한다.
이렇게 전부다 뒤져서 익스플로잇 코드를 작성한다.
ret부분에 strcpy가 덮이고 인자로 덮힘당할 memsetgot의 주소와 덮을 문자의 주소가 들어간다. strcpy함수가 끝나면 poppopret 이 수행되어 인자 두개를 제끼고 다시 strcpy함수로 들어가는 rop이다.
공격을 하면
쉘을 얻을수 있다.
쉘코드: