ipwn

[LOB(Lord Of Buffer overflow)] darkelf -> orge 본문

Write up/LOB

[LOB(Lord Of Buffer overflow)] darkelf -> orge

ipwn 2018. 1. 17. 00:34

이번 단계는 darkelf 단계이다. 바로 접속해보자.


이번에는 조금 다르게 copy file을 만들지 않고 파일들을 살펴보겠다.



기본적으로 주어지는 orge파일과 orge.c 코드가 있다. 바로 코드부터 보자.



좀 더 길어졌다. 저번 코드와 거의 완벽히 유사하다. 아마 똑같이 argv[2]를 넣어서 풀 것이다.


하지만 조금 달라진 점은 argv[0]의 길이를 검사해 만약 77byte크기가 아니라면 프로그램을 종료시킨다는 점이다.


그래서 이번엔 copy file을 먼저 만들지 않고 파일을 확인했다. 어찌 됐던 copy file을 만들어야 


core dump를 확인할 수 있을테니 copy file을 만들어보자. 대신 만들 때 file 이름의 길이를 75자로 만들어 줄 것이다.


왜냐하면 argv[0]에는 경로를 포함한 file의 이름이 들어가기 때문이다. 즉 ./file name(75byte)가 있다면 .와 /도 


파일명으로 처리하고 즉 .와 / 총 2byte를 제외한 길이로 file 이름을 만들어줘야 한다는 의미이다.


하지만 gdb로 debugging 할 때는 절대경로로 받아오기 때문에 file 이름을 다르게 지어줘야할 것이다.


각설하고 일단 copy file을 만들어주도록 하겠다.



성공적으로 copy file이 만들어졌다.


한 번 저 copy file을 segmentation fault를 일으켜서 core dump를 가져와보겠다.



성공적으로 core dump를 가져왔다. 이제 core dump를 gdb로 debugging해 메모리를 확인해보겠다.



이렇게 argv[0], argv[1], argv[2]의 값이 쭉 나열된 것을 확인할 수 있다.


이제 우리가 넘겨줘야 할 payload는 argv[1] = dummy*44 + 0xbffffae0(임의의 nop의 위치), argv[2] = nop(\x90)*200 +

 

shellcode가 될 것이다. 한 번 제대로 작동하는지 payload를 copy file에 넘겨주어 shell을 가져와보겠다.



성공적으로 shell을 가져왔다.


하지만 원본 file에 이 payload를 똑같이 넣어준다고 해도 권한이 상승된 shell을 가져올 수는 없을 것이다.


이유는 당연히 argv[0]의 길이가 77byte가 아니어서이다.


그렇다면 어떻게 해야할까? 


방법은 간단하다. 심볼링 링크(symbolic link)를 걸어주면 된다. 


사실 새로운 개념이겠지만 윈도우로 치면 바로가기 개념이라고 보면 편하다.


적용 방법은 ln -s [원본파일] [바로가기 파일이름]의 형태이다.


한 번 바로 원본파일에 symbolic link를 걸어보겠다.



성공적으로 symbolic link가 생성됐다.


이제 바로 symbolic link file에 payload를 넘겨주도록 하겠다.



성공적으로 권한이 상승된 shell이 가져와졌다.


orge로 가는 password는 timewalker이다.

Comments