반응형

*풀다가 노트북을 맥북으로 바꾸는 바람에 중간에 터미널모양이 약간 바뀌엇다 양해바람..  

GOT, PLT ,_dl_runtime_resolve가 어떤식으로 맞물려있는지 알게해준 굉장히 고마운 문제다.. 

ctf풀기 시작하면서 정말 많이 배우는것 같다..

#다른사람들이랑 환경이 달라서그런가.. 바이너리에서 더해주는 값이 다르다.. 

 

□ description

==========================================

ssh guest@58.229.183.15 / ExtremelyDangerousGuest

ssh guest@58.229.183.14 / ExtremelyDangerousGuest



==========================================


 □ number of solvers : 32

 □ breakthrough by

    1 : CodeRed (02/22 10:40)

    2 : euronop (02/22 11:37)

    3 : stratumauhuur (02/23 02:00)







# memory가 랜덤이지만, 로컬에서 익스플로잇 하는 문제이기 떄문에 ulimit -s unlimited 명령을 이용해 메모리 랜덤을 비활성화 해주고 진행하였다.


컴퓨터랑 4목을 두는 게임이다(근데 재미없음 ..) 



+)우왕 ㅋ 이김ㅋ (이기는 방법알아내는게 생각보다 좀 오래걸렷다 ...)



졋을때와 이겻을때의 output값


이겻을떄 몇초가 걸렷는지 output 값으로 내보내주는데, 이 부분에 뭔가 있을것 같아 IDA로 이부분을 찾아서 

Hex-ray로 디컴파일을 해보았다

[Decompile]



게임에서 0초 이내에 이기면,4byte의 값을 임의의 주소에 입력받는다는 것을 알 수 있다.


근데 밑의 부분에 


 HIWORD(v2) = HIWORD(argv1);

 LOWORD(v2) = 0;

 if ( v2 != 0x8040000 )                  // stack

        {

          if ( (argv1 & 0xF0000000) != 0xB0000000 )

            *(_DWORD *)argv1 = v3;



4byte 입력 받는 값이 stack의 주소를 갖지않고(stack의 주소라는 것은 아래의 그림을 통해 확인 할 수있

다,0x8040000),0xB0000000(바이너리) 의 주소를 갖지 않는다면, 

입력받은 값이 첫번쨰 인자의 값이 된다(4byte)


뿐만아니라, 이문제는 프로그램의 마지막 부분에서 처음으로 exit()함수를 사용한다. 

즉, 우리가 dl_runtime_resolve부분을 조작할 수  있다는 것을 의미한다.

그러면  exit()을 한번 따라 들어가보도록 하자 

[exit@plt 를 처음으로 호출하는 부분 ]



[exit@plt]



[exit@got]:  exit()가 _dl_runtime_resolve에 의해서 got상에 올라가기 전 상태,

~ exit@plt 부분에서 got호출 하는 주소의 바로다음 주소를 가르킨다.


+)반대로 got상에  exit()이 올라간 상태 



[exit@plt+11 에서 jmp한 부분] 

 objdump로 분석해본 결과 이부분의 심볼을 확인할 수 있엇는데 printf@plt-0x10 이라고 적혀있다.. 

이부분이 무슨기능을 하는지는 추후에 좀더 알아보고 추가하도록 하겟다.


+)plt 에서 _dl_runtime_resolve로 넘어가기전에 exit@plt -> .plt 영역 -> dl_runtime_resolve



[_dl_runtime_resolve]400139b0




[_dl_fixup] 0x4000db40 ~ 0x4000dc61




[_dl_fixup_  에서 반환 값을 결정해주는 부분]


eax :40082000


gdb-peda$ x/x $edi+0x4

0x4008e828: 0x00016d60

즉,  eax의 값 (0x40081000)에 [edi+0x4]의 값이 더해져서 반환값으로 사용된다.

따라서 0x40081000를 덮어씌우고, 0x00016d60을 더한곳으로 eip를 변조할 수 있음을 알아내었다.

랜덤스택으로인해서 그냥 환경변수를 때려넣어주게 되면 맞추기 힘들다 .. 

그래서 http://blackcon.tistory.com/90 를 참고해서 spraying 기법으로 환경변수를 뿌려서 이용해 보려 한다.




그러면 이제 분석을 모두 마쳣으니 본격적으로 쉘을 따보자





[payload]

[4목 이기는 로직 ] [환경변수 주소 ] ;cat| ./4stone  [rwx영역의 주소]

0x40081000 

 

(perl -e 'print "\xd","hh","\xd","h","\xd","\xd","hhhh","\xd","h","\xd","hhh","\xd","hh","\xdbf743089"';cat)|./4stone 40081000







+)32bit의 elf fileformat 이다

처음 파일 실행할때 64 bit 환경에서 실행을 했엇는데, 64bit 에서 gcc-multilib 없이 32 비트 프로그램을 실행시키면 그런파일이 없다고 뜬다..multilib 를 설치해주던가 32 bit 환경에서 실행하도록하자





반응형
,