wargame/Lord Of Buffer overflow

[LOB] orc

LimeLee 2018. 8. 13. 02:44

개인적으로 RET 함수 뒤에 쉘 코드를 써 내려 가는 방법을 배웠던 적이 있어서 goblin 문제보다 쉽게 풀 수 있었다. 


소스코드 분석



프로그램은 인자로 입력값을 받고, 환경변수에 쉘 코드를 삽입하는 방법을 방지하기 위해 환경변수를 0으로 덮어 씌워버린다.

그리고 인자 값의 48번째 값이 \bf가 아니라면 프로그램을 종료한다. 다른 쉘 코드 삽입 방법이 많지만 스택에 쉘 코드를 삽입하여 문제를 풀라는 의미인 듯 하다. 위의 조치를 다 하면 strcpy 함수를 통해 buffer에 입력 값을 복사하고 출력한다.


문제 풀이





argv[1][47] != '\xbf'' 로 인해 48번째 값이 \xbf가 들어가야 프로그램이 도중 종료되지 않는 것을 확인 할 수 있다.

덤으로 Segmentation fault가 발생한다.



strace를 이용하여 바이너리 추적을 해보았을 때, 44번째까지 buffer + sfp 이고 bof로 점프해야할 주소의 첫 값이 bf여야 한다.

쉘코드는 buffer의 값이 40이여서 안에 넣을 수 있지만, 역시나 NOP Sled 기법을 이용하기 위해선 너무나 작은 값이다.

그래서 RET 주소 이후의 값을 덮어 씌워 RET 주소 뒤의 값으로 점프 시킨다.



참고로 다음 문제가 RET 주소의 뒤를 이용하는 문제여서 풀이를 위해 일부러 buffer의 값에 쉘코드를 넣어 하려 했지만,

좁아터진 buffer에서 NOP Sled 기법으로 대략적으로 주소를 때려 맞추다 잘못 이동하면 이렇게 쉘이 완전히 깨져버려 이번 문제에서는 RET 주소 뒤에 쉘코드를 넣는 방법을 이용한다.

위 같은 에러는 쉘을 아예 빠져나가 LOB 첫 로그인 화면으로 넘어가면 해결된다.



이번에도 main이 끝나는 ret 함수에서 bof가 일어나므로 그전인 main+211쯤에서 브레이크를 건다,



주소가 들어가는 45~48번째 값 뒤에 주소를 대략적으로 알아내기 위해 A를 100개 넣어 실행한다.



다음과 같이 스택에 A(0x41)이 들어가있는 걸 알 수 있다.



A가 시작하는 주소는 0xbffff960이다. NOP Sled를 이용하므로 적당히 0xbffff970을 이용한다.



페이로드는 'DUMMY * 44 + (쉘 코드의 대략적인 주소 값) + "\x90" + (쉘 코드)' 가 된다.



'wargame > Lord Of Buffer overflow' 카테고리의 다른 글

[LOB] goblin  (0) 2018.08.13
[LOB] cobolt  (0) 2018.08.07
[LOB] gremlin  (0) 2018.08.07