nemo의 이야기
narnia1.c 파일을 확인하면 환경변수 EGG를 쉘코드로 바꿔 공격하는 방식이다. 그러면 우선 환경변수를 쉘코드로 바꿔야 된다. export를 사용하여 EGG에 쉘코드를 작성한다. 그리고 env로 확인하면 성공적으로 쉘코드가 넣어진걸 확인할 수 있다. 이제 narnia1을 실행 시켜보자 이와같이 공격에 성공했음을 알 수 있다.
다양한 문제를 분석하기 위해 narnia 문제를 풀어보자 우선 narnia0 문제에 c파일을 확인하면 val에 41414141에 값이 들어가 있다 이를 deadbeef로 바꿔서 sh를 따는 문제이다. val을 직접 바꾸는 코드가 없으므로 buf를 오버플로우를 해서 val 메모리에 접근해서 값을 바꿔야된다. 우선 gdb를 이용해서 분석해보자 메모리를 확인하면 buf에 b값을 넣고 20byte떨어진 위치에 41414141이 있는 걸 확인할 수 있다. 그러면 buf에 dumy값 20byte와 deadbeef를 쓰면 sh을 딸 수 있을 것이다. argv를 사용하지 않아 문자를 넣기 위해 파이프라인을 사용하자 (python -c 'print "A"*20 +"\xef\xbe\xad\xde"';cat) | ./nar..
쉘 코드 : 쉘을 실행하는 코드 즉 기계어로 작성 execve를 이용해서 execve("/bin/sh,NULL") 코드를 어셈블리어로 작성해보자 execve에 인자를 esp를 기준으로 삼는다. argv esp-8 0 esp-4 /bin esp '//sh' 이런 형식으로 edx는 0을 넣기위해 xor로 초기화시켜준다. 4byte씩 맞추기 위해 /sh => //sh로 바꿔준다. 나머지 0으로 32비트를 8비트로 들어가려면 0으로 되므로 al을 사용해서 크기에 맞게 설정해줘야 된다. shellcode를 실행시켜서 sh를 따냈으면 성공한 것이다. 이제 이 소스에 기계어를 확인해서 쉘코드를 작성할 것이다. #> objdump -d shellcode를 사용하여 위와 같은 기계어 코드를 확인할 수 있을 것이다. 숫자..