*풀다가 노트북을 맥북으로 바꾸는 바람에 중간에 터미널모양이 약간 바뀌엇다 양해바람..
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 환경에서 실행하도록하자
'과거의 컴퓨터 공부 > CodeGate2014' 카테고리의 다른 글
(Codegate2014)Clone Technique(250p,reversing) (0) | 2015.03.30 |
---|---|
(Codegate2014)dodoCrackme(200pt,Reversing) (0) | 2015.03.28 |
(CodeGate2014)Angry_doraemon(250P,pwnable) (0) | 2015.03.25 |