wargame/Lord Of Buffer overflow 4

[LOB] orc

개인적으로 RET 함수 뒤에 쉘 코드를 써 내려 가는 방법을 배웠던 적이 있어서 goblin 문제보다 쉽게 풀 수 있었다. 소스코드 분석 프로그램은 인자로 입력값을 받고, 환경변수에 쉘 코드를 삽입하는 방법을 방지하기 위해 환경변수를 0으로 덮어 씌워버린다.그리고 인자 값의 48번째 값이 \bf가 아니라면 프로그램을 종료한다. 다른 쉘 코드 삽입 방법이 많지만 스택에 쉘 코드를 삽입하여 문제를 풀라는 의미인 듯 하다. 위의 조치를 다 하면 strcpy 함수를 통해 buffer에 입력 값을 복사하고 출력한다. 문제 풀이 argv[1][47] != '\xbf'' 로 인해 48번째 값이 \xbf가 들어가야 프로그램이 도중 종료되지 않는 것을 확인 할 수 있다.덤으로 Segmentation fault가 발생한다..

[LOB] goblin

소스코드 분석 cobolt 문제와 비슷하게 16byte 크기의 buffer가 존재하므로 같은 방법을 이용해도 괜찮을 듯 하다.다른 점은 이번 문제에선 인자로 받지 않지 않는다. 이는 인자값을 넘기는 `` 대신 다른 명령을 통해 해결할 수 있다. 문제는 stdin이라는 힌트다. cobolt와 같은 방법을 했는데 쉘을 따지지 않는데 이유를 알려면 시스템 적인 배경지식이 어느정도 있어야 알 수 있는 듯하다. 아직까지도 완벽한 이해는 하지 못했다. 문제 풀이 여러가지 방법이 있겠지만, 쉘 코드의 주소로 이동하는 데에는 cobolt와 별 다른 차이점이 없으므로 환경 변수와 NOP Sled 기법을 이용한다. 환경변수는 프로그램을 만들어 출력했다. 위치는 0xbffffea8임을 알 수 있다.인자 값이 아닌 프로그램의..

[LOB] cobolt

소스코드 분석 gremlin과 비슷하게 인자 첫번째 값을 buffer에 복사한다. 여전히 취약한 함수인 strcpy를 이용한다.하지만 주석처리된 힌트를 보면 small buffer를 볼 수 있다. cobolt 문제에서는 배열의 크기가 16밖에 되지 않는다. 문제 풀이 cobolt도 역시 strace를 통해 바이너리를 추적하여 ret 주소를 덮어씌우는 위치를 찾아낸다.cobolt에서는 buffer의 크기 16byte + sfp의 크기 4byte를 가져 21byte 째부터 ret 주소를 덮어씌우는 것을 확인 할 수 있다.총 20byte의 쉘코드를 삽입 할 수 있지만, gremlin에서 사용했던 20byte가 넘는 쉘 코드를 사용할 수 없을 뿐 더러 20byte보다 작은 값을 쉘코드를 사용했다 하더라도 NOP..

[LOB] gremlin

소스코드 분석 argc가 2개 미만 즉 인자가 없으면 프로그램을 종료하고, 아니라면 첫 번째 인자 값을 버퍼에 복사한 뒤 출력한다.simple BOF문제이다. 문제 풀이위의 소스에서 보았듯이 BOF문제다. 문제는 strcpy 함수를 사용하고 있기 때문에 BOF가 발생한다.strcpy 함수는 메모리 경계를 검사하지 않아 buffer의 크기보다 큰 길이의 값을 복사하게 되면 buffer를 넘어서 다른 값 까지 덮어씌운다.그렇다면 buffer의 크기를 넘어선 값을 입력하게 되면 무슨 일이 일어나는지 확인해보자. 다음은 gremlin 프로그램에 A를 261개 삽입했을때 strace를 이용하여 바이너리를 추적한 결과값이다. ret 값을 덮어쓰기 시작하여 segmentation fault가 발생한 것을 알 수 있고..