목록Information security (35)
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 라는 것을 확인할 수 ..
코드를 확인하면 1. argv를 1개 이상을 사용하지 못한다. 이번 문제는 RET가 아닌 SFP의 1byte를 변조하여 프로그램의 실행 히름을 바꾸는 문제이다. 이를 해결하기 위해서는 Fake Ebp를 하여 원하는 위치에 공격 코드를 올려서 공격하면 된다. 우선 problem_child ebp와 esp를 확인해보자 bffffa41 주소에서 41부분에 주소를 바꿔 공격하면 된다. 그러면 leave 명령을 통해 SFP가 있는 곳으로 이동 후 변조된 ebp값을 pop을 함으로써 main 에 ebp값은 변조된 ebp값으로 저장 problem_child 함수의 RET를 통해 다시 main 프레임으로 복귀 main 함수의 leave가 수행된다. 마지막으로 ret 명령으로, eip는 esp를 참조해서 다음 실행할 주..